web-dev-qa-db-fra.com

WinForms + DataGridView liaison à une liste <T>

J'essaie de lier un List<T> à un contrôle DataGridView, et je n'ai aucune chance de créer des liaisons personnalisées.

J'ai essayé:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));

Il lève une exception, disant que rien n'a été trouvé par ce nom de propriété.

Le nom de la colonne en question est "Opcode". Le nom de la propriété dans le List<T> est Opcode.

ANSWER EDIT: le problème était que je n'avais pas les champs pouvant être liés dans ma classe en tant que propriétés, juste des champs publics ... Apparemment, cela ne reflète pas les champs, juste les propriétés.

34
FlySwat

La propriété sur la grille que vous liez à Opcode est-elle également? ... si vous voulez vous lier directement à List, vous devez simplement DataSource = list. Les liaisons de données permettent une liaison personnalisée. essayez-vous de faire autre chose que la source de données?

Vous obtenez un tas de lignes vides? les colonnes générées automatiquement ont-elles des noms? Avez-vous vérifié que les données se trouvent dans l'objet (pas seulement string.empty)?

    class MyObject
    {
        public string Something { get; set; }
        public string Text { get; set; }
        public string Other { get; set; }
    }

    public Form1()
    {
        InitializeComponent();

        List<MyObject> myList = new List<MyObject>();

        for (int i = 0; i < 200; i++)
        {
            string num = i.ToString();
            myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num  });
        }

        dataGridView1.DataSource = myList;
    }

cela devrait bien fonctionner ...

14
Quintin Robinson

Je ne peux pas vraiment dire ce que vous essayez de faire avec l'exemple que vous avez inclus, mais la liaison à une liste générique d'objets est assez simple si vous voulez simplement lister les objets:

    private BindingSource _gridSource;

    private BindingSource GridSource
    {
        get
        {
            if (_gridSource == null)
                _gridSource = new BindingSource();
            return _gridSource;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        List<FluffyBunny> list = new List<FluffyBunny>();
        list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" });
        list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" });
        list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" });

        GridSource.DataSource = list;
        dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column
        dataGridView1.DataSource = GridSource;

    }

Si vous ne souhaitez afficher que des propriétés spécifiques du type de la liste, vous devriez pouvoir rendre invisibles les colonnes indésirables.

Techniquement, vous n'avez pas vraiment besoin de créer le BindingSource, mais je trouve que c'est beaucoup plus facile lorsque je fais des mises à jour ou des changements si je l'ai.

J'espère que cela t'aides.

5
Jared

Eu le même problème ... J'avais une structure avec des champs publics évidemment. rien dans la grille. fourni public getters, travaillé.

4
bill gates

Une autre solution que j'ai trouvée consiste à utiliser la collection BindingList.



private void Form1_Load(object sender, EventArgs e)
{
   BindingList people= new BindingList {
    new Person {Name="John",Age=23},
    new Person {Name="Lucy",Age=16}
  };

   dataGridView1.DataSource= people;
}

Ça fonctionne bien pour moi,

4
Nikola Stjelja