Использование BindingList (Of Object) - позднее связывание CodeDom

1

Я пытаюсь использовать 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?

  • 0
    Вы пробовали любую другую сетку? DataGridView - не самый лучший элемент управления на рынке. Это может не поддерживать все эти сложные вещи. Есть ли причина, по которой вы избегаете использования потомка DataTable?
  • 1
    Так так. Я бы поспорил с Big Bucks, что проблема была в DGV, потому что BindingList - это просто фантастический список. Я неохотно пытался использовать DataTable вместо B-List - Bingo, это сработало. По-видимому, это отчасти потому, что когда DataTable является источником, его имена столбцов используются в качестве DataDisplayNames (добавление к ним «X» привело к пустой сетке). Итак, это сильно упростит вещи, мне не только не нужен BindingList, но и компонент CodeDOM. Если вы хотите опубликовать ответ, я приму его, поскольку вы отправили меня по этому пути. Спасибо за толчок!
Теги:
data-binding

1 ответ

1
Лучший ответ

Попробуйте использовать класс потомков DataTable. Раньше я использовал этот подход в производственной среде с помощью стороннего управления сеткой - он работал нормально. Должен также работать с DataGridView.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню