Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to bind list to dataGridView?

I seem to be running around in circles and have been doing so in the last hours.

I want to populate a datagridview from an array of strings. I've read its not possible directly, and that I need to create a custom type that holds the string as a public property. So I made a class:

public class FileName     {         private string _value;          public FileName(string pValue)         {             _value = pValue;         }          public string Value         {             get              {                 return _value;             }             set { _value = value; }         }     } 

this is the container class, and it simply has a property with the value of the string. All I want now is that string to appear in the datagridview, when I bind its datasource to a List.

Also I have this method, BindGrid() which I want to fill the datagridview with. Here it is:

    private void BindGrid()     {         gvFilesOnServer.AutoGenerateColumns = false;          //create the column programatically         DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn();         DataGridViewCell cell = new DataGridViewTextBoxCell();         colFileName.CellTemplate = cell; colFileName.Name = "Value";         colFileName.HeaderText = "File Name";         colFileName.ValueType = typeof(FileName);          //add the column to the datagridview         gvFilesOnServer.Columns.Add(colFileName);          //fill the string array         string[] filelist = GetFileListOnWebServer();          //try making a List<FileName> from that array         List<FileName> filenamesList = new List<FileName>(filelist.Length);         for (int i = 0; i < filelist.Length; i++)         {             filenamesList.Add(new FileName(filelist[i].ToString()));         }          //try making a bindingsource         BindingSource bs = new BindingSource();         bs.DataSource = typeof(FileName);         foreach (FileName fn in filenamesList)         {             bs.Add(fn);         }         gvFilesOnServer.DataSource = bs;     } 

Finally, the problem: the string array fills ok, the list is created ok, but I get an empty column in the datagridview. I also tried datasource= list<> directly, instead of = bindingsource, still nothing.

I would really appreciate an advice, this has been driving me crazy.

like image 286
Amc_rtty Avatar asked Aug 04 '09 16:08

Amc_rtty


2 Answers

Use a BindingList and set the DataPropertyName-Property of the column.

Try the following:

... private void BindGrid() {     gvFilesOnServer.AutoGenerateColumns = false;      //create the column programatically     DataGridViewCell cell = new DataGridViewTextBoxCell();     DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn()     {         CellTemplate = cell,          Name = "Value",         HeaderText = "File Name",         DataPropertyName = "Value" // Tell the column which property of FileName it should use      };      gvFilesOnServer.Columns.Add(colFileName);      var filelist = GetFileListOnWebServer().ToList();     var filenamesList = new BindingList<FileName>(filelist); // <-- BindingList      //Bind BindingList directly to the DataGrid, no need of BindingSource     gvFilesOnServer.DataSource = filenamesList  } 
like image 121
sloth Avatar answered Sep 19 '22 13:09

sloth


may be little late but useful for future. if you don't require to set custom properties of cell and only concern with header text and cell value then this code will help you

public class FileName {              [DisplayName("File Name")]       public string FileName {get;set;}      [DisplayName("Value")]       public string Value {get;set;} } 

and then you can bind List as datasource as

private void BindGrid() {     var filelist = GetFileListOnWebServer().ToList();         gvFilesOnServer.DataSource = filelist.ToArray(); } 

for further information you can visit this page Bind List of Class objects as Datasource to DataGridView

hope this will help you.

like image 42
Nasir Mahmood Avatar answered Sep 21 '22 13:09

Nasir Mahmood