【问题标题】:Creating new columns in a dataGridView from the values in a dictionary根据字典中的值在 dataGridView 中创建新列
【发布时间】:2012-12-04 20:07:39
【问题描述】:

我有一个程序可以将 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]);

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

【问题讨论】:

  • 您能否提供一个设计时代码示例,以便我们查看您的 XML 结构?

标签: c# winforms datagridview


【解决方案1】:

在你的代码中

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();

【讨论】:

  • 我不知道,我认为 item.Value.ToString() 正在遍历字典,因此它没有卡在最后一项上。哦,好吧。
猜你喜欢
  • 2022-01-24
  • 2017-04-10
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多