Я пытаюсь использовать BindingList с объектом, созданным во время выполнения, используя CodeDom. Но я думаю, что столкнулся с поздней связующей стеной. Создание Type и DLL работает хорошо, и я могу получить доступ к свойствам, и поэтому может intellisense. Но элемент управления BindingList или DataGridView не работает с ним.
Поскольку мой новый тип неизвестен до времени выполнения после методов 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. Я также попытался установить/сбросить DGV DataDisplayNames после того, как в списке появился законный myObject
. Я понимаю, что это не работает, когда это просто Object, но не почему он не работает, когда CodeDom Type наследуется от известного типа.
Итак, может ли быть что-то подобное (и если да, то в чем заключается трюк)? Есть ли атрибут, который я мог бы использовать в источнике CodeDom или трюк с помощью TypeDescriptor?
Попробуйте использовать класс потомков DataTable. Раньше я использовал этот подход в производственной среде с помощью стороннего управления сеткой - он работал нормально. Должен также работать с DataGridView.