使用列表作为 DataGridView 的数据源

Posted

技术标签:

【中文标题】使用列表作为 DataGridView 的数据源【英文标题】:Using a list as a data source for DataGridView 【发布时间】:2011-09-22 07:59:30 【问题描述】:

我已将配置文件中的设置名称及其各自的值提取到有序字典中。字典包含 ICollection 类的键和值。我想绑定该数据并将其显示在 DataGridView 中。我尝试将字符串复制到数组并显示这些数组,但是当我运行程序时,列是空白的,并且似乎根本没有绑定。

我还尝试将 DataGridView 源直接设置为有序字典集合(键或值)之一,但这也没有产生任何我想要的结果;列仍然是空白的。但是,第三列的列名称为“length”,并显示 ICollection 中条目的长度。但不用说我不想要长度,我想要条目本身。

这是我用于这个问题的代码:加载表单后,我加载配置文件,一个名为 m_Settings 的私有成员拥有所有键值对。然后我创建一个列表并分别添加键和值。将绑定源设置为“数据”后,我运行程序,我添加的两列都是空白的。

    private void Form4_Load(object sender, EventArgs e)
    
        loadconfigfile(Properties.Settings.Default.Config);
        List<Object> data = new List<Object>();
        data.Add(m_Settings.Keys);
        data.Add(m_Settings.Values);
        bindingSource1.DataSource = data;
        dataGridView1.DataSource = bindingSource1;
        dataGridView1.Refresh();
    

关于如何获取有序字典并将条目显示在标有“设置”和“值”的两列中的任何想法?我相信列表与 DataGridViews 兼容的数据源,但现在我开始怀疑自己了。

非常感谢任何帮助或指导!如果需要,我很乐意提供更多信息。

谢谢!

编辑

这里是修改后的代码,实现了 myStruct 类:

    List<myStruct> list = new List<myStruct>();
    for(int index = 0; index < m_Settings.Count; index++)
    
        myStruct pair = new myStruct(keys[index], values[index].ToString());
        list.Add(pair);
    

    public class myStruct
    
        private string Key  get; set; 
        private string Value  get; set; 

        public myStruct(string key, string value)
        
            Key = key;
            Value = value;
        
    

但是,当我将绑定 DataDource 设置为列表时,DataGridView 上什么也没有出现,它只是空的。有人知道为什么吗?

【问题讨论】:

上面的代码真的适合你吗?我试过了,但直到我将 KeyValue 更改为 public (就像他们在接受的答案中一样......) @obe 当时没有,它是基于我得到的答案中的建议的代码。答案是真正有效的。 【参考方案1】:

首先,我不明白您为什么要添加所有键和值计数次数,从未使用过索引。

我试过这个例子:

        var source = new BindingSource();
        List<MyStruct> list = new List<MyStruct>  new MyStruct("fff", "b"),  new MyStruct("c","d") ;
        source.DataSource = list;
        grid.DataSource = source;

效果很好,我得到了两个名称正确的列。 MyStruct 类型公开了绑定机制可以使用的属性。

    class MyStruct
   
    public string Name  get; set; 
    public string Adres  get; set; 


    public MyStruct(string name, string adress)
    
        Name = name;
        Adres = adress;
    
  

尝试构建一个接受一个键和值的类型,并一个一个地添加。 希望这会有所帮助。

【讨论】:

@MBen:啊,是的,我注意到,就在我发布之后,我很抱歉。感谢您的意见,我将实现类似的东西,并让您知道它是如何进行的。 @MBen:你好!正如你所建议的,我已经按照相同的思路实现了一些东西,请看一下编辑。不幸的是,datagridview 仍然是空的。我错过了什么吗? 嗯,是的,你应该作为对值传递。您正在做的是添加键,然后添加值,它如何知道您想要一个键列,值列。在我的示例中,我用一个类包装了字符串,并声明了公共属性。在我的示例中,您可以用 KeyType 键替换字符串名称,用 ValueType 替换字符串地址。您需要遍历所有键和值,并一一添加新结构。 不,您应该创建一种具有两种属性的类型,一种公开键,一种公开值。 Class KeyValueClass public KeyType Key get;set; public YourValuetype Value get;set; 然后将这个 Class 一个一个添加到列表中。 @MBen:知道了!它现在完全可以工作了。非常感谢您的帮助和指导。祝你有美好的一天! =)【参考方案2】:

设置 DataGridView 属性

    gridView1.AutoGenerateColumns = true;

并确保您正在绑定的对象列表,这些对象属性应该是公开的。

【讨论】:

【参考方案3】:

这个函数可以帮助你。它将每个列表对象添加到网格视图

private void show_data()
        
            BindingSource Source = new BindingSource();

            for (int i = 0; i < CC.Contects.Count; i++)
            
                Source.Add(CC.Contects.ElementAt(i));
            ;


            Data_View.DataSource = Source;

        

我为简单的数据库应用程序编写此代码

【讨论】:

以上是关于使用列表作为 DataGridView 的数据源的主要内容,如果未能解决你的问题,请参考以下文章

中止排序datagridview

组合框单元格值数据源datagridview

Datagridview将Comboboxcolumns绑定到更改列表

c#怎么在dataGridView里面添加一列?

c#怎么在dataGridView里面添加一列?

如何从 DataGridView 中的一行获取 DataRow