使用列表作为DataGridView的数据源

38
我从配置文件中提取了设置名称及其相应的值到有序字典中。该字典包含一个实现了ICollection接口的键和值。我想将这些数据绑定并在DataGridView中显示。我尝试将字符串复制到数组中并显示这些数组,但运行程序时列是空白的,并没有绑定成功。
我也尝试直接将DataGridView源设置为有序字典集合之一(键或值),但也没有得到我想要的结果;列仍然是空白的。不过,第三列的列名为“length”,显示ICollection中条目的长度。但毋庸置疑,我不想要长度,我想要条目本身。
这是我在这个问题中使用的代码:在窗体加载时,我加载配置文件,并且一个私有成员m_Settings拥有所有的键值对。然后我创建一个列表,并分别添加键和值。在将绑定源设置为“data”之后,我运行程序,但我添加的两个列都是空白的。
    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();
    }
有什么想法可以获取有序字典并显示条目,分成两列标记为“设置”和“值”?我认为列表是DataGridView的兼容数据源,但现在我开始怀疑自己。
非常感谢任何帮助或指导!如果需要,我很乐意提供更多信息。
谢谢!
编辑: 这里是已实现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;
        }
    }

然而,当我将数据绑定源设置为列表时,DataGridView中没有任何内容显示,它是空的。有人知道原因吗?


以上的代码对你来说真正有效吗? 我试过了,但除非我将“ Key”和“ Value”更改为“ public”(就像被接受的答案一样...),否则它不起作用。 - obe
@obe 当时它并没有起作用,那只是基于我得到的答案建议的代码。正确的答案才是真正可行的。 - tf.rz
3个回答

62

首先,我不明白为什么您要将所有键和值都添加count次,Index从未使用。

我尝试了这个示例:

        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:啊,是的,我发帖后就注意到了,抱歉。谢谢你的建议,我会实现类似的东西并告诉你效果如何。 - tf.rz
@MBen:你好!我按照你的建议实现了类似的功能,请看一下我的修改。不幸的是,DataGridView 仍然是空的。我错过了什么吗? - tf.rz
1
好的,是的,你应该传递成键值对。 你现在所做的是添加键,然后添加值,它怎么知道你想要一个键列和一个值列呢? 在我的例子中,我用一个类包装了字符串,并声明了公共属性。在我的例子中,你可以用KeyType key替换字符串名称,用ValueType替换字符串地址。你需要循环遍历所有的键和值,并逐个添加新的结构。 - MBen
@MBen,根据我的理解,我应该实现一个名为KeyType的类和另一个名为ValueType的类,它们分别包含它们的公共属性。然后循环遍历所有的键和值,逐个添加到myStruct结构中(该结构包含KeyType key和ValueType value)。 - tf.rz
1
不,你应该创建一个类型,它有两个属性,一个暴露Key,另一个暴露Value。 类 KeyValueClass { public KeyType Key {get;set;} public YourValuetype Value {get;set;} } 然后逐一将此类添加到列表中。 - MBen
1
@MBen:明白了!现在已经完全正常工作了。非常感谢您的帮助和指导。祝您有美好的一天!=) - tf.rz

8

设置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;

        }

我为简单的数据库应用编写了这篇文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接