【问题标题】:How to dynamically set source of DataGridView in C#?如何在 C# 中动态设置 DataGridView 的来源?
【发布时间】:2012-04-24 07:16:00
【问题描述】:

我有一些存储数据的列表

List<List<string>> data = new List<List<string>>();

如何正确分配给dataGridView.DataSource

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:
    List<List<string>> data = new List<List<string>>();
    dataGridView.DataSource = data;
    dataGridView.Databind();
    

    正如一些海报所说,这是针对 Windows 窗体的,在这种情况下,您可以(根据 MSDN)jst 设置数据源而不是数据绑定

    【讨论】:

    • Windows 窗体中的 DataGridView。
    【解决方案2】:

    这里的问题是(显然)DataGridView DataSource 属性不知道如何显示List&lt;List&lt;string&gt;&gt;。一种方法是将您的列表组合成一个 DataGridView 可以绑定的对象。这里有几种方法可以做到这一点:

    到数据表:

    为了将您的List&lt;List&lt;string&gt;&gt; 转换为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&lt;List&lt;string&gt;&gt; 获取一个 DataTable,您可以将其绑定到您的 DataGridView:

    dataGridView.DataSource = data.ToDataTable();
    

    到匿名类型列表:

    这是执行此操作的代码:

    dataGridView.DataSource = data.SelectMany(lst => lst)
                                  .Select(s => new { Value = s }).ToList();
    

    我们需要匿名类型,因为如果没有一点帮助,DataGridView 将无法在 List 属性中显示字符串值,如 here 所述。


    这两种方法当然都有缺点,但我确实相信这些方法是您的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多