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

时间:2010-09-30 09:08:49

标签: c# .net winforms linq data-binding

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

SystemText(类别,名称,语言代码,文本)

我创建了一个模型对象,它将这些字段作为属性,我使用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)}

现在唯一的麻烦就是将对象绑定到我的gridlist。我会在加载表单时动态创建网格列,具体取决于可用的语言。我认为在DataMember属性中使用类似语言(“EN”)的东西会起作用,但似乎不是这样。

我现在有点受阻了,我想用别的东西替换语言的字典,但我真的不知道我能用什么。

1 个答案:

答案 0 :(得分:0)

所以,经过一些试验和错误,我找到了一些方法来做到这一点。

我发现的第一个也是最复杂的方法之一是弗拉基米尔·伯罗多夫在this blog post上给出的。这个想法基本上是动态创建一个匿名类型,它具有Dictionary中每个键的属性。它非常聪明且非常有用,但对于我需要的小任务来说有点矫枉过正。

另一种方法是使用自定义属性描述符。我们的想法是创建一个自定义列表类型,当要求特殊属性调用时,将调用一个自定义函数,该函数将发回该值。可以看到此方法的示例here。遗憾的是,我无法使用此方法,因为我使用的网格组件无法使用自定义属性描述符。

我还考虑使用Dynamic Linq生成动态查询,我可以在其中更改查询结果的属性名称(请参阅this Scottgu's article)但我不想仅使用另一个库我需要的很简单。

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