使用列表作为 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 上什么也没有出现,它只是空的。有人知道为什么吗?
【问题讨论】:
上面的代码真的适合你吗?我试过了,但直到我将Key
和 Value
更改为 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 的数据源的主要内容,如果未能解决你的问题,请参考以下文章