0

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

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

其中 custXML 是以 import_seq 为键,display_name 为值的字典。这是我尝试添加到我的 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]);

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

4

1 回答 1

0

在您的代码中

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

您反复将所有列标题更改为相同的字符串。因此,它们都以 XML 中最后一项的名称结束。您需要为每个新的键值对设置适当的 DataGridViewColumn 的标题,而不是遍历所有 DataGridViewColumns。

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

编辑以回答评论:

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

if (item.Key >= 0  && item.Key <= 63)
    foo[item.Key].HeaderText = item.Value.ToString();
于 2012-12-04T22:00:19.373 回答