Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

winForms + DataGridView binding to a List<T>

I'm trying to bind a List<T> to a DataGridView control, and I'm not having any luck creating custom bindings.

I have tried:

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

It throws an exception, saying that nothing was found by that property name.

The name of the column in question is "Opcode". The name of the property in the List<T> is Opcode.

ANSWER EDIT: the problem was that I did not have the bindable fields in my class as properties, just public fields...Apparently it doesn't reflect on fields, just properties.

like image 559
FlySwat Avatar asked Sep 24 '08 02:09

FlySwat


People also ask

What is binding list in C#?

BindingList is a generic list type that has additional binding support. While you can bind to a generic list, BindingList provides additional control over list items, i.e. if they can be edited, removed or added. BindingList also surfaces events that notify when the list has been changed.

What is DataGridView data binding?

The DataGridView control supports the standard Windows Forms data binding model, so it can bind to a variety of data sources. Usually, you bind to a BindingSource that manages the interaction with the data source.

What is DataGridView in C#?

The DataGridView control provides a customizable table for displaying data. The DataGridView class allows customization of cells, rows, columns, and borders through the use of properties such as DefaultCellStyle, ColumnHeadersDefaultCellStyle, CellBorderStyle, and GridColor.


2 Answers

Is the property on the grid you are binding to Opcode as well?.. if you want to bind directly to List you would just DataSource = list. The databindings allows custom binding. are you trying to do something other than the datasource?

You are getting a bunch of empty rows? do the auto generated columns have names? Have you verified data is in the object (not just 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;     } 

this should work fine...

like image 150
Quintin Robinson Avatar answered Oct 23 '22 01:10

Quintin Robinson


I can't really tell what you're trying to do with the example you included, but binding to a generic list of objects is fairly straightforward if you just want to list the objects:

    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;      } 

If you only want to display specific properties of the List's type you should be able to make the unwanted column(s) invisible.

Technically, you don't really need to create the BindingSource, but I find it's a whole lot easier when I'm doing updates or changes if I have it.

Hope this helps.

like image 31
Jared Avatar answered Oct 23 '22 01:10

Jared