【问题标题】:DataGridView bound to a Nested Dictionary绑定到嵌套字典的 DataGridView
【发布时间】:2019-09-11 14:35:33
【问题描述】:

我试过看到这个:DataGridView bound to a Dictionary

但这并不是我想要的,所以我来了。

我有一本这样的字典(只是它的外观示例):

{
    "file": 
    {
        "var-type": 
            {
                "var1": 
                       {
                           "description": "the description here",
                           "length": "the length here",
                           "type": "the type here",
                           "line": "the line number here",
                       }
            }
    }
}

并且希望有一个看起来像这样的DataGridView(实时,因此绑定它):

+------+-----------------+-----------------+---------------+
| Name |   Description   |     Length      |     Type      |
+------+-----------------+-----------------+---------------+
| var1 | the description | the length here | the type here |
+------+-----------------+-----------------+---------------+

DataGridView 将位于TabPage 中(在TabController 中,该标签页的名称为var-type

起初我有一本字典,每次用户想要它的DataGridView 时,DataGridView 都会从零开始一次又一次地生成。

因此,当用户更改某些内容时,他们必须重新打开 DataGridView 或手动刷新它才能看到新的更改。我不想要这个。所以我尝试为每个var-type 设置DataTables(并使用Dictionary 作为DataTable 集合,并且用户在编辑某些内容时会得到实时更改。

效果很好。但是在编辑特定 var 的信息时,我将不得不使用.Select()(而且我不能将行号存储在同一个 DataTable 中)。我想避免这种情况,所以我又回到了一本万能的字典。我还听说字典要轻得多。

我也尝试在使用DataTables 时存储每个变量的行号以避免.Select(),但我也对这种方法有一些问题,我更愿意使用字典。

我不想创建 DataGridView 并在每次用户想要查看它时使用 for 循环(因此我使用 DataTables 作为我可以在任何地方访问的属性,并且只要将它们用作 DataSource我想显示它们),我只想能够随时使用它们。这可能吗?

仅作记录;是的,这是一个解析器。非常感谢!

【问题讨论】:

  • 是的,我一直在回复这样的帖子。看起来您有 JSON,但看不到对象的类(也没有字典)。我可以轻松发布代码将您的 LIst() 对象转换为数据表,但目前没有足够的信息来完成任务。
  • 这不是一个真正的 JSON,它只是一个让它可读的例子。这是一本字典。我想避免每次都循环,再次感谢。

标签: c# .net winforms dictionary datagridview


【解决方案1】:

使用以下之一:

            DataTable dt = new DataTable();

            Dictionary<string, DataRow> dict1 = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Name"), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            Dictionary<string, List<DataRow>> dict2 = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Name"), y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

【讨论】:

  • 您好,感谢您的回复。但是您似乎误解了我要做什么。我已经说过我放弃了 DataTables,现在我正在使用一个通用的字典。我举了一个 JSON 示例,说明字典的外观,以及我希望它如何成为 DataGridView。向字典中添加新内容时,我想实时更改 DataGridView。
  • 为什么要放弃比获取 JSON 然后将 JSON 转换为类更有效的 DataTable?您应该始终更改 DGV 的数据源,而不是尝试直接修改 DGV。
  • @Rookie 如果你想要真实类型的更新,你需要一个可以通知属性变化的对象。 DataTable 可以,BindingSourceBindingList 也可以。您是这里最好的朋友,可能是链接到 BindingSource 的 DataTable。顺便说一句,您真的不需要每个var-type 的DataTable,这就是DataRow 的内容。如果需要,您可以添加一个用作标识符/索引器的列(到 DataTable,隐藏在 DGV 中)。
  • ...我没有 JSON,伙计。我已经说过几次了。这只是一个例子,来源是internal static Dictionary&lt;string, Dictionary&lt;string, Dictionary&lt;string, Dictionary&lt;string, string&gt;&gt;&gt;&gt; Variables { get; set; },我不是要直接修改 DGV。我只是希望它在我的字典更改时更新。
  • @Jimi:我仍然可以有多个标签页,每个标签页都有不同的var-type,只有一个数据表?
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多