我正在尝试将BindingList与使用CodeDom在运行时创建的对象一起使用。但我想我已经遇到了一个晚期绑定墙。创建类型和DLL都运行良好,我可以访问属性,因此可以intellisense。但是BindingList或DataGridView控件无法使用它。
由于我的新Type在CodeDom方法之后的运行时才知道,所以我不能这样做:
Private myBList As BindingList(Of myDomType)
但这不起作用:
myBList = New BindingList(Of Object)
...
Dim obj = CreateNewDomObject(values()) ' values passed to the constructor
myBList.Add(obj) ' the DGV doesnt show the data
Of Object
显然不会使用已知类型的wvwn:
myBList = New BindingList(Of Object)
...
myBList.Add(New Foo) ' Foo is a known Type
显然DGV或BindingList不会打扰后期绑定对象。所以我尝试了这个:
Public MustInherit Class myObject
... 2 trivial properties
End Class
然后更改CodeDom生成器以使创建的CodeDom类继承自myObject。这是为了提供一个具体的绑定类型并允许:
myBList = New BindingList(Of myObject) ' a concrete type
...
Dim obj = CreateNewDomObject(values()) ' returns a myObject type
myBList.Add(obj)
此编译没有后期绑定警告,但数据仍未显示在DGV中。在列表中存在合法myObject
之后,我还尝试设置/重置DGV DataDisplayNames。当它只是Object时,我可以理解这不起作用,但当CodeDom Type继承自已知类型时,它不能解释为什么它不起作用。
那么,可以做这样的事情(如果是这样,那么诀窍是什么)?是否有我可以在CodeDom源中使用的属性或使用TypeDescriptor的技巧?
答案 0 :(得分:1)
尝试使用DataTable后代类。我之前使用第三方网格控件在生产环境中使用了这种方法 - 它工作正常。也应该使用DataGridView。