Partage
  • Partager sur Facebook
  • Partager sur Twitter

WinForm DataGriwView DataSource Ajouter ligne vide

Apres avoir "liés" une Liste , comment ajouter une ligne vide.

Sujet résolu
    28 mai 2022 à 20:46:28

    Bonjour à vous.

    J'ai créé un petit tableau, auquel je peux sauvegarder/charger.

    La portion sauvegarder ce fais très bien. Je peux ajouter des lignes autant que je veux et continuer a sauvegarder le tout, dans un fichier

    Mais lorsque je charge le fichier, j'apercois mes lignes, mais je n'ai pas la possibilité d'en ajouter plus.

    Puisque le DataSource est liés, il est impossible d'ajouter une ligne vide, pour continuer à remplir le tableau.

    Je vois beaucoup d'exemple sur les forums d'aides, mais je ne comprend pas comment. La plupart du temps, il refont une nouvelle table.. sans ajouter les items existant, ce qui pose problème.

     Le seul exemple que j'ai réussit à faire quelque chose est ce lien

    Puisque mon DataSource est une List<Item>. DataTable et/ou BindingSource ne peut pas être "caster".

    J'ai fais un petit exemple de mon problème.

    Voici une image de ce que cela ressemble:

    Item.cs

    public class Item
        {
            public string Title { get; set; }
            public string Description { get; set; }
            public decimal Price { get; set; }
    
            public object getattr(string name)
            {
                return this.GetType().GetProperty(name).GetValue(this);
            }
            public void setattr(string name, object value)
            {
                this.GetType().GetProperty(name).SetValue(this, value, null);
            }
        }

    ListItems.cs

    using System.Collections.Generic;
    using System.IO;
    using System.Text.Json;
    
    public class ListItems
        {
            List<Item> lst_items = new List<Item>();
    
            public void Add(Item item)
            {
                lst_items.Add(item);
            }
    
            public void Save(string filePath)
            {
                var options = new JsonSerializerOptions { WriteIndented = true };
                var jsonString = JsonSerializer.Serialize(this.lst_items, options);
                File.WriteAllText(filePath, jsonString);
            }
            public List<Item> Load(string filePath)
            {
                if (File.Exists(filePath))
                {
                    string jsonString = File.ReadAllText(filePath);
                    this.lst_items = JsonSerializer.Deserialize<List<Item>>(jsonString);
                }
                return this.lst_items;
            }
        }


    Voici ma form:

    public partial class Form1 : Form
        {
            string directory = AppContext.BaseDirectory;
            string fileName = "items.json";
            string fullPath;
    
            List<string> lst_names = new List<string>() { "Title", "Description", "Price" };
    
            ListItems cls_lstItems = new ListItems();
    
            public Form1()
            {
                this.fullPath = Path.Combine(this.directory, this.fileName);
    
                InitializeComponent();
            }
    
            private void btn_Load_Click(object sender, EventArgs e)
            {
                var lst_items = this.cls_lstItems.Load(this.fullPath);
                gridItems.DataSource = lst_items;
                gridItems.Refresh();
            }
    
            private void btn_Save_Click(object sender, EventArgs e)
            {
                foreach (DataGridViewRow row in gridItems.Rows)
                {
                    if (!string.IsNullOrEmpty((string)row.Cells["Description"].Value))
                    {
                        var item = new Item();
    
                        foreach (var name in this.lst_names)
                        {
                            var value = row.Cells[name].Value;
                            if (value != null)
                            {
                                item.setattr(name, value);
                            }
                        }
                        this.cls_lstItems.Add(item);
                    }
                }
    
                this.cls_lstItems.Save(this.fullPath);
            }
        }

    Comme vous le voyez, on peut ajouter des lignes, et sauvegarder dans le fichier.

    Mais lorsque l'on charge le fichier, il est impossible de continuer a rajouter des lignes.

    Merci de votre aide.

    NLT

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 mai 2022 à 22:40:39

      Salut !

      gridsitems.DataSource possède plein de problème de ce que j'ai lu.

      Il faut convertir tes données en BindingSource pour que ça fonctionne bien.

              private void btn_Load_Click(object sender, EventArgs e)
              {
                  var lst_items = this.cls_lstItems.Load(this.fullPath);
                  var source = new BindingSource(lst_items, null);
                  grid.DataSource = source;
                  gridItems.Refresh();
              }

      Normalement ça devrait fonctionner comme il le faut là ^^

      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2022 à 23:59:47

        Salut ;)

        Wow, merci beaucoup. C'est aussi simple que cela.:waw::-°

        J'essayais tellement de cast, entre les DataTable, DataRow, DataSource, BindingSource.

        J'aurais jamais pensé a simplement créer une source directement. :D:p

        Merci beaucoup

        • Partager sur Facebook
        • Partager sur Twitter

        WinForm DataGriwView DataSource Ajouter ligne vide

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown