代码之家  ›  专栏  ›  技术社区  ›  Gimly

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

  •  0
  • Gimly  · 技术社区  · 14 年前

    我正在尝试创建翻译表的轴。基本上这张桌子是这样的:

    系统文本(类别、名称、语言代码、文本)

    我已经创建了一个模型对象,它具有这些字段作为属性,我正在使用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”)的东西是可行的,但似乎不是这样。

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Gimly    14 年前

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

    第一个也是我发现的最复杂的方法之一是弗拉基米尔·伯罗多夫 this blog post . 其基本思想是动态创建一个匿名类型,该类型对字典中的每个键都有一个属性。这是非常聪明和非常有用的,但有点过分为我需要的小任务。

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

    我还考虑使用动态LINQ生成动态查询,这样我就可以更改查询结果的属性名(请参见 this Scottgu's article )但我不想仅仅为了我需要的简单的东西而使用另一个图书馆。

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