2010-09-30 55 views
0

我试图创建转换表的数据透视表。基本上,该表是这样的:将包含散列表的结构绑定到网格

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)} 

现在我唯一的麻烦是将对象绑定到我的网格列表。根据可用的语言,当表单加载时,我会动态创建网格的列。我认为在DataMember属性中使用诸如语言(“EN”)之类的东西可以工作,但似乎并非如此。

我现在有点被封锁了,我想过用其他的东西来代替语言的字典,但我真的不知道我能用什么。

回答

0

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

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

另一种解决方法是使用自定义属性描述符。这个想法是创建一个自定义列表类型,当被问及特殊属性时会调用一个自定义函数来返回值。这种方法的例子可以看到here。再次不幸的是我不能使用这个方法,因为我使用的网格组件不能使用自定义属性描述符。

我也想过使用Dynamic Linq来生成动态查询,我可以改变查询结果的属性名称(请参阅this Scottgu's article),但我不想为简单的事情使用另一个库I需要。

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