Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将包含哈希表的结构绑定到网格_C#_.net_Winforms_Linq_Data Binding - Fatal编程技术网

C# 将包含哈希表的结构绑定到网格

C# 将包含哈希表的结构绑定到网格,c#,.net,winforms,linq,data-binding,C#,.net,Winforms,Linq,Data Binding,我正在尝试创建转换表的轴。基本上,表格是这样的: SystemTextCategory、名称、语言代码、文本 我已经创建了一个模型对象,它将这些字段作为属性,我正在使用NHibernate从数据库中获取数据 现在我要显示的是一个网格,用于编辑将显示在同一行上的翻译类别、文本名称和所有未事先固定的可用语言。例如: 类别|名称|英语|法语|德语 我已经设法创建了一个Linq查询来创建我将需要做的枢轴。看起来是这样的 Dim test = From systemText In _systemTexts

我正在尝试创建转换表的轴。基本上,表格是这样的:

SystemTextCategory、名称、语言代码、文本

我已经创建了一个模型对象,它将这些字段作为属性,我正在使用NHibernate从数据库中获取数据

现在我要显示的是一个网格,用于编辑将显示在同一行上的翻译类别、文本名称和所有未事先固定的可用语言。例如:

类别|名称|英语|法语|德语

我已经设法创建了一个Linq查询来创建我将需要做的枢轴。看起来是这样的

Dim test = From systemText In _systemTexts _
           Group systemText By Key = New With {Key systemText.TextCategory, Key systemText.TextName} Into g = Group _
           Select New With {Key .TextCategory = Key.TextCategory, _
                            Key .TextName = Key.TextName, _
                                .Languages = g.ToDictionary(Function(st) st.LanguageCode, Function(st) st.Description)}
现在我唯一的麻烦就是将对象绑定到我的网格列表。我会在加载表单时动态创建网格的列,具体取决于可用的语言。我原以为在DataMember属性中使用LanguagesEN之类的东西会起作用,但事实似乎并非如此


我现在有点受阻了,我想用别的东西来代替这些语言的字典,但我真的看不出我能用什么。

所以,经过一些尝试和错误后,我终于找到了一些方法

第一种,也是我发现的最复杂的方法之一,是弗拉基米尔·布罗多夫(Vladimir Burodov)在上一篇文章中提出的。其基本思想是动态创建一个匿名类型,该类型对字典中的每个键都有一个属性。这是非常聪明和非常有用的,但对于我需要的小任务来说有点过分了

另一种方法是使用自定义属性描述符。其思想是创建一个自定义列表类型,当请求特殊属性时,该类型将调用一个将返回值的自定义函数。可以看到这种方法的例子。同样不幸的是,我无法使用此方法,因为我正在使用的网格组件无法使用自定义属性描述符

我还考虑过使用动态Linq来生成动态查询,在这里我可以更改查询结果的属性名称,但我不想为了我需要的简单事情而使用另一个库

最后,endend所做的是动态创建一个DataTable,在其中插入Linq查询的结果,将DataTable绑定到网格,最后侦听RowUpdate事件,并对NHibernate集合执行CRUD操作。它工作得很好,代码也很容易理解