2012-01-12 4 views
2

Я работаю над приложением winforms, где я передаю данные о доменах/объектах через ultrawingrid. Я использую bindingsource для привязки объекта к grid.For простых объектов это работает достаточно хорошо.Вложения свойств вложенных объектов UltraWinGrid с BindingSource

То, что я пытаюсь развернуть, - это рендеринг объекта с вложенными объектами, например, класс Person будет иметь свойство класса Address. Я хотел бы отображать свойства Address (Street, City, Country) в виде столбцов на сетке вместе со свойствами класса Person.

Сетка должна быть доступна для редактирования, и любые изменения пользователя должны отражаться на объекте домена (который я делаю через источник привязки).

Каков наилучший способ сделать это?

ответ

1

Связывание

Я обычно использую какой-то код вроде этого:

Dim persons = new BindingList(Of Person) 
UltraGrid1.DataSource = persons 

Связующий список будет обрабатывать добавления/удаления строк для вас, но он не знает о свойства внутри Person. Чтобы получить эту часть привязки к работе, вам нужно будет установить PersonINotifyPropertyChanged. Это приведет к уведомлению об ультраграфе при изменении свойств. Код будет выглядеть примерно так (да, к сожалению, это делает его таким образом Вы не можете использовать авто Реализуемого свойства):

Private _phoneNumber As String 
Public Property PhoneNumber As String 
    Get 
    Return Me._phoneNumber 
    End Get 
    Set(ByVal value As String) 
    If value <> _phoneNumber Then 
     Me._phoneNumber = value 
     NotifyPropertyChanged("PhoneNumber") 
    End If 
    End Set 
End Property 

Сведения иерархий объектов

Похоже, что вы спросите для isn't directly possible. Есть несколько вариантов:

  1. несвязанных столбцы в интерфейсе, которые вы заполняете в ходе мероприятия InitializeRow
  2. Измените Person класс, чтобы выставить свойства Address с некоторым проходом через код для обработки настройки свойств ,

(я может обеспечить образцы кода, если это необходимо)

один-ко-многим Вложенные объекты

Если вы, к примеру, имел несколько адресов на человека, вы могли бы показать им вложенным в расширяемой секции под каждой строкой Person. Для этого внутри вашего Person у вас будет BindingList(Of Address), который также реализует INotifyPropertyChanged. Не совсем то, что вы хотите, но вариант :)

Слова предостережения

Несколько замечаний, если вы делаете MVP. Очевидно, вам нужно иметь такую ​​же ссылку на BindingList. Кроме того, если вам нужно сбросить содержимое, я бы рекомендовал позвонить list.Clear() вместо создания нового. Если вы создадите новый в своем презентаторе, вы нарушите соединение с UltraGrid, и вам нужно будет повторно установить свойство DataSource в представлении.

Смежные вопросы