如何将列表绑定到dataGridView?

我似乎在圈子里跑来跑去,在过去的几个小时里一直在这样做。

我想从一个string数组中填充一个datagridview。 我读过它不可能直接,我需要创build一个自定义types,该string作为公共属性。 所以我上了一堂课:

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

这是容器类,它只是一个具有string值的属性。 我现在想要的就是那个string出现在datagridview中,当我把它的数据源绑定到一个List。

我也有这个方法,BindGrid(),我想填充datagridview。 这里是:

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

最后,问题:string数组填充好,列表创build好,但我在datagridview中得到一个空的列。 我也直接尝试datasource = list <>,而不是= bindingsource,仍然没有。

我真的很感激一个build议,这一直让我疯狂。

谢谢

使用BindingList并设置列的DataPropertyName属性 。

尝试以下操作:

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

可能会迟一点,但对未来有用。 如果你不需要设置单元格的自定义属性,只关心标题文本和单元格值,那么这段代码将帮助你

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

然后你可以绑定List作为数据源

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

有关更多信息,您可以访问此页面将类对象的列表作为数据源绑定到DataGridView

希望这会帮助你。

我知道这已经很久了,但是这让我挂了一阵子。 您列表中的对象的属性必须是实际的“属性”,而不仅仅是公共成员。

 public class FileName { public string ThisFieldWorks {get;set;} public string ThisFieldDoesNot; } 

您可以使用dataTable来代替创build新的Container类。

 DataTable dt = new DataTable(); dt.Columns.Add("My first column Name"); dt.Rows.Add(new object[] { "Item 1" }); dt.Rows.Add(new object[] { "Item number 2" }); dt.Rows.Add(new object[] { "Item number three" }); myDataGridView.DataSource = dt; 

更多关于这个问题你可以在这里find: http : //psworld.pl/Programming/BindingListOfString

使用DataTable是有效的user927524陈述。 您也可以通过手动添加行来完成,而不需要添加特定的包装类:

 List<string> filenamesList = ...; foreach(string filename in filenamesList) gvFilesOnServer.Rows.Add(new object[]{filename}); 

在任何情况下,感谢user927524清除这个奇怪的行为!