web-dev-qa-db-fra.com

Utilisation d'une liste en tant que source de données pour DataGridView

J'ai extrait les noms de paramètres et leurs valeurs respectives d'un fichier de configuration dans un dictionnaire ordonné. Le dictionnaire contient des clés et des valeurs appartenant à la classe ICollection. Je veux lier ces données et les afficher dans un DataGridView. J'ai essayé de copier les chaînes dans des tableaux et de les afficher, mais lorsque j'ai exécuté le programme, les colonnes étaient vides et il ne semblait pas du tout être lié.

J'ai également essayé de définir directement la source DataGridView sur l'une des collections de dictionnaires ordonnées (clés ou valeurs), mais cela n'a pas abouti à ce que je voulais; les colonnes étaient encore vides. Toutefois, une troisième colonne est créée avec le nom de colonne "longueur" et affiche les longueurs des entrées dans ICollection. Mais inutile de dire que je ne veux pas les longueurs, je veux les entrées elles-mêmes.

Voici le code que j'utilise pour cette question: Lors du chargement du formulaire, je charge le fichier de configuration et un membre privé appelé m_Settings possède toutes les paires clé-valeur. Ensuite, je crée une liste et ajoute les clés et les valeurs séparément. Après avoir défini la source de liaison sur "data", je lance le programme et les deux colonnes que j'ai ajoutées sont vides.

    private void Form4_Load(object sender, EventArgs e)
    {
        loadconfigfile(Properties.Settings.Default.Config);
        List<Object> data = new List<Object>();
        data.Add(m_Settings.Keys);
        data.Add(m_Settings.Values);
        bindingSource1.DataSource = data;
        dataGridView1.DataSource = bindingSource1;
        dataGridView1.Refresh();
    }

Des idées sur la façon dont je pourrais obtenir le dictionnaire commandé et afficher les entrées dans deux colonnes intitulées "Paramètres" et "Valeurs"? Je crois que les listes étaient des sources de données compatibles pour DataGridViews, mais je commence maintenant à deviner moi-même.

Toute aide ou direction est grandement appréciée! Je serai heureux de fournir plus d'informations si nécessaire.

Merci!

ÉDITER :

Voici le code révisé avec la classe myStruct implémentée:

    List<myStruct> list = new List<myStruct>();
    for(int index = 0; index < m_Settings.Count; index++)
    {
        myStruct pair = new myStruct(keys[index], values[index].ToString());
        list.Add(pair);
    }

    public class myStruct
    {
        private string Key { get; set; }
        private string Value { get; set; }

        public myStruct(string key, string value)
        {
            Key = key;
            Value = value;
        }
    }

Toutefois, lorsque je mets la liste DataDource de liaison en liste, rien ne s'affiche sur le DataGridView, il est simplement vide. Quelqu'un sait pourquoi?

30
tf.rz

Premièrement, je ne comprends pas pourquoi vous ajoutez toutes les clés et toutes les valeurs, car Index n’est jamais utilisé.

J'ai essayé cet exemple:

        var source = new BindingSource();
        List<MyStruct> list = new List<MyStruct> { new MyStruct("fff", "b"),  new MyStruct("c","d") };
        source.DataSource = list;
        grid.DataSource = source;

et cela fonctionne assez bien, je reçois deux colonnes avec les noms corrects. Le type MyStruct expose les propriétés que le mécanisme de liaison peut utiliser.

    class MyStruct
   {
    public string Name { get; set; }
    public string Adres { get; set; }


    public MyStruct(string name, string adress)
    {
        Name = name;
        Adres = adress;
    }
  }

Essayez de créer un type prenant une clé et une valeur et ajoutez-les une par une. J'espère que cela t'aides.

46
MBen

Définir la propriété DataGridView

    gridView1.AutoGenerateColumns = true;

Et assurez-vous que la liste d'objets que vous êtes en train de lier, ces propriétés d'objet doivent être publiques.

6
Yamanappa

ce Func peut vous aider. il ajoute tous les objets de la liste à la vue grille

private void show_data()
        {
            BindingSource Source = new BindingSource();

            for (int i = 0; i < CC.Contects.Count; i++)
            {
                Source.Add(CC.Contects.ElementAt(i));
            };


            Data_View.DataSource = Source;

        }

J'écris ceci pour une application de base de données simple

0
naqib