DataGridView如何绑定字典集合数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView如何绑定字典集合数据相关的知识,希望对你有一定的参考价值。

1. DataGridView中一列一列的绑定(列名存在集合arrList中,数据存在DataTable) 解释:集合(arrList)中存SQL语句SELECT中的"名字"转换成DataTable的"列名"//通过集合中的名字创建列名 protected DataTable CreateTable(ArrayList arrList, DataReader reade
1. DataGridView中一列一列的绑定(列名存在集合arrList中,数据存在DataTable)

解释:集合(arrList)中存SQL语句SELECT中的"名字"转换成DataTable的"列名"//通过集合中的名字创建列名

protected DataTable CreateTable(ArrayList arrList, DataReader reader)

// reader可以从ExecuteReader获得



// DataTable的名字

DataTable dt = new DataTable("table");

//给DataTable定列名

for (int i = 0; i < arrList.Count; i++)



DataColumn dtColumn = new DataColumn();

dtColumn.ColumnName = (string)arrList[i];

dt.Columns.Add(dtColumn);



//往DataTable里加行

DataRow dtRow;

while (reader.Read())



dtRow = dt.NewRow();

for (int i = 0; i < arrList.Count; i++)



try



dtRow[(string)arrList[i]] = reader.GetValue(i).ToString();



catch



dtRow[(string)arrList[i]] = System.DBNull.Value;





dt.Rows.Add(dtRow);



return dt;



DataTable m_listViewInfo = CreateTable(集合名,DataReader名);

//将DataTable绑定到DataView中

DataView dvListViewInfo = new DataView(m_listViewInfo);

dataGridView1.Columns.Clear();

//取消dataGridView1按默认方式显示

dataGridView1.AutoGenerateColumns = false;

//绑定DataView到dataGridView上

dataGridView1.DataSource = dvListViewInfo;

DataGridViewTextBoxColumn dtcTimeStamp = new DataGridViewTextBoxColumn();

dtcTimeStamp.DataPropertyName = "TIMESTAMP";//SQL语句得到的列名,可从集合中获得dtcTimeStamp.HeaderText = "日期";//列头显示的汉字dtcTimeStamp.Width = 110;

dataGridView1.Columns.Add(dtcTimeStamp);//最后一定要添加进去
参考技术A 在DataGridView的Columns中可以设置每个列绑定的字段。设置绑定字段为DataPropertyName 参考技术B 这些最好还是买本书系统学习下的好

使用列表作为 DataGridView 的数据源

【中文标题】使用列表作为 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中自定义格式数据

c#字典dictionary绑定datagridview如何排序

DataGridView 绑定list类, 如何只显示list集合中类的部分属性

绑定到字典的 DataGridView

C# 中 datagridview 绑定BindingList类型和更新

winform datagridview 绑定泛型集合变得不支持排序的解决方案