如何将List <String>绑定到DataGridView控件?

我有一个简单的List<string> ,我想它显示在一个DataGridView列。
如果列表将包含更复杂的对象,只需将该列表build立为其DataSource属性的值即可。

但是,当这样做:

 myDataGridView.DataSource = myStringList; 

我得到一个名为Length的列,并显示string的长度。

如何在列中显示列表中的实际string值?

那是因为DataGridView查找包含对象的属性。 对于string,只有一个属性 – 长度。 所以,你需要一个这样的string包装

 public class StringValue { public StringValue(string s) { _value = s; } public string Value { get { return _value; } set { _value = value; } } string _value; } 

然后将List<StringValue>对象绑定到您的网格。 有用

尝试这个:

 IList<String> list_string= new List<String>(); DataGridView.DataSource = list_string.Select(x => new { Value = x }).ToList(); dgvSelectedNode.Show(); 

我希望这有帮助。

只要你绑定了任何实现了IEnumerable <string>的东西,以下就应该可以工作。 它将直接将列绑定到string本身,而不是绑定到该string对象的属性path。

 <sdk:DataGridTextColumn Binding="{Binding}" /> 

你也可以使用linq和匿名types来获得相同的结果, 这里描述的代码less得多。

更新:博客是closures的,这里是内容:

(..)表中显示的值表示string的长度而不是string值(!)这可能看起来很奇怪,但是这就是默认情况下绑定机制的工作原理 – 给定一个对象,它将尝试绑定到该属性的第一个属性对象(它可以find的第一个属性)。 当传递一个String类的实例时,它绑定的属性是String.Length,因为没有其他属性可以提供实际的string本身。

这意味着要得到我们的绑定正确的,我们需要一个包装对象,将作为一个属性公开的string的实际值:

 public class StringWrapper { string stringValue; public string StringValue { get { return stringValue; } set { stringValue = value; } } public StringWrapper(string s) { StringValue = s; } } List<StringWrapper> testData = new List<StringWrapper>(); // add data to the list / convert list of strings to list of string wrappers Table1.SetDataBinding(testdata); 

虽然这个解决scheme按预期工作,但它需要很多行代码(主要是将string列表转换为string包装器列表)。

我们可以通过使用LINQ和匿名types来改进这个解决scheme – 我们将使用LINQ查询来创build一个新的string包装列表(在我们的例子中,string包装将是一个匿名types)。

  var values = from data in testData select new { Value = data }; Table1.SetDataBinding(values.ToList()); 

我们要做的最后一个改变是将LINQ代码移动到一个扩展方法:

 public static class StringExtensions { public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings) { var values = from data in strings select new { Value = data }; return values.ToList(); } 

这样我们就可以通过在任何string集合上调用single方法来重用代码:

 Table1.SetDataBinding(testData.CreateStringWrapperForBinding()); 

这是常见的问题,另一种方式是使用DataTable对象

 DataTable dt = new DataTable(); dt.Columns.Add("column name"); dt.Rows.Add(new object[] { "Item 1" }); dt.Rows.Add(new object[] { "Item 2" }); dt.Rows.Add(new object[] { "Item 3" }); 

这个问题在这里详细描述: http : //www.psworld.pl/Programming/BindingListOfString

尝试这个 :

 //i have a List<string> g_list = new List<string>(); //i put manually the values... (for this example) g_list.Add("aaa"); g_list.Add("bbb"); g_list.Add("ccc"); //for each string add a row in dataGridView and put the l_str value... foreach (string l_str in g_list) { dataGridView1.Rows.Add(l_str); } 

通过LINQ分配真正大的列表时,您可能会遇到性能问题。 以下解决scheme适用于大型列表且无子类String:

将DataGridView(这里是“View”)设置为虚拟模式,创build您需要的列并覆盖/注册事件CellValueNeeded

 private void View_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { // Optionally: check for column index if you got more columns e.Value = View.Rows[e.RowIndex].DataBoundItem.ToString(); } 

那么你可以简单地将你的列表分配给DataGridView:

 List<String> MyList = ... View.DataSource = MyList; 

另一种方法是使用一个新的帮助函数,它将从List中获取值,并在DataGridView中进行更新,如下所示:

  private void DisplayStringListInDataGrid(List<string> passedList, ref DataGridView gridToUpdate, string newColumnHeader) { DataTable gridData = new DataTable(); gridData.Columns.Add(newColumnHeader); foreach (string listItem in passedList) { gridData.Rows.Add(listItem); } BindingSource gridDataBinder = new BindingSource(); gridDataBinder.DataSource = gridData; dgDataBeingProcessed.DataSource = gridDataBinder; } 

然后我们可以用下面的方法调用这个函数:

  DisplayStringListInDataGrid(<nameOfListWithStrings>, ref <nameOfDataGridViewToDisplay>, <nameToBeGivenForTheNewColumn>);