从字典中的值在d​​ataGridView中创建新列

时间:2012-12-04 20:07:39

标签: c# winforms datagridview

我有一个程序,它将XML文件中的字段读入字典。我想根据字典中的值在d​​ataGridView中命名和创建列。问题是,直到运行时我才会知道字典中的值是什么,以及按什么顺序排列。有没有办法以编程方式执行此操作,还可以指定它们将成为哪种类型的列(如组合框,文本框等)?

 custXML=
        doc.Descendants("DT100")
           .ToDictionary(d => (int)d.Element("import_seq"),
                         d => (string)d.Element("display_name"));

其中custXML是一个以import_seq为键,display_name为value的Dictionary。这是我尝试添加到我的datagridview(有固定的64列,其中一些可能是空的):

DataGridViewColumn[] foo = new DataGridViewColumn[64];
for (int i = 0; i < 63; i++)
  foo[i] = new DataGridViewColumn();

foreach (KeyValuePair<int, string> item in custXML)
{
  for (int i = 0; i < 63; i++)
    foo[i].HeaderText = item.Value.ToString();
}

for (int i = 0; i < 63; i++)
  dataGridView1.Columns.Add(foo[i]);

然而,当我运行它时,列的名称都说“源代码”

1 个答案:

答案 0 :(得分:0)

在您的代码中

foreach (KeyValuePair<int, string> item in custXML)
        {
            for (int i = 0; i < 63; i++)
                foo[i].HeaderText = item.Value.ToString();
        }

您反复将所有列标题更改为相同的字符串。所以他们最终都得到了XML中最后一项的名称。而不是循环遍历所有DataGridViewColumns,对于每个新的键值对,您需要设置相应的DataGridViewColumn的标题。

我将把实施作为练习留给你:)

编辑以回答评论:

foreach迭代字典,但内部循环将当前字典项应用于所有列。所以最后,所有列都获得最后一个字典条目的项值。如果我理解你想要做什么,你可能想用

重复内循环
if (item.Key >= 0  && item.Key <= 63)
    foo[item.Key].HeaderText = item.Value.ToString();