【发布时间】:2012-04-24 07:16:00
【问题描述】:
我有一些存储数据的列表
List<List<string>> data = new List<List<string>>();
如何正确分配给dataGridView.DataSource?
【问题讨论】:
标签: c# datagridview
我有一些存储数据的列表
List<List<string>> data = new List<List<string>>();
如何正确分配给dataGridView.DataSource?
【问题讨论】:
标签: c# datagridview
List<List<string>> data = new List<List<string>>();
dataGridView.DataSource = data;
dataGridView.Databind();
正如一些海报所说,这是针对 Windows 窗体的,在这种情况下,您可以(根据 MSDN)jst 设置数据源而不是数据绑定
【讨论】:
这里的问题是(显然)DataGridView DataSource 属性不知道如何显示List<List<string>>。一种方法是将您的列表组合成一个 DataGridView 可以绑定的对象。这里有几种方法可以做到这一点:
到数据表:
为了将您的List<List<string>> 转换为DataTable,我借用了here 找到的代码并创建了这个扩展方法:
static class ListExtensions {
public static DataTable ToDataTable(this List<List<string>> list) {
DataTable tmp = new DataTable();
tmp.Columns.Add("MyData");
// Iterate through all List<string> elements and add each string value to a new DataTable Row.
list.ForEach(lst => lst.ForEach(s => tmp.Rows.Add(new object[] {s})));
return tmp;
}
}
现在您可以使用此扩展方法从您的 List<List<string>> 获取一个 DataTable,您可以将其绑定到您的 DataGridView:
dataGridView.DataSource = data.ToDataTable();
到匿名类型列表:
这是执行此操作的代码:
dataGridView.DataSource = data.SelectMany(lst => lst)
.Select(s => new { Value = s }).ToList();
我们需要匿名类型,因为如果没有一点帮助,DataGridView 将无法在 List 属性中显示字符串值,如 here 所述。
这两种方法当然都有缺点,但我确实相信这些方法是您的最佳选择。
【讨论】: