Привязка коллекции объектов к ComboboxColumn в DataGridView

У меня есть графический интерфейс, который позволяет пользователю выбирать отчет для просмотра/редактирования. Когда пользователь выбирает отчет, он показывает элементы в отчете. У Item есть много свойств, большинство из которых привязываются должным образом. Одним из свойств является Owner, и оно привязано к ComboBoxColumn.

  • Report
    • Items
      • Owner

Я делал что-то очень похожее на это несколько раз, и у меня не было проблем, когда я устанавливал DataPropertyName, DataSource, ValueMember и DisplayMember. Единственное отличие состоит в том, что на этот раз вместо типа Item, имеющего OwnderID, он фактически имеет экземпляр объекта Owner.

В другом сообщении я видел предложение решить эту проблему, предоставив элементам, связанным в списке, свойство самоссылки, которое позволяет им возвращать себя для целей установки ValueMember

Однако, когда я связываю это следующим образом:

OwnerColumn.DataPropertyName = "Owner"
OwnerColumn.DataSource = ownersBindingSource1
OwnerColumn.ValueMember = "Self"
OwnerColumn.DisplayMember = "OwnerName"

Я получаю много ошибок, таких как:

Unable to cast object of type 'System.String' to type 'Owner'.

и:

The following exception occurred in the DataGridView:

System.ArgumentException: DataGridViewComboBoxCell value is not valid.

To replace this default dialog please handle the DataError event.

Я смог обойти некоторые из этих ошибок, связав их следующим образом:

OwnerColumn.DataPropertyName = "Owner"
OwnerColumn.DataSource = ownersBindingSource1

а также сделав функцию ToString на дисплее Owner свойством OwnerName. Это кажется довольно хакерским, и я думаю, что неправильно понимаю что-то фундаментальное, поскольку оно все еще не работает должным образом. Любая помощь приветствуется.


person Origin    schedule 24.01.2012    source источник


Ответы (1)


Я обнаружил, что многие мои ошибки были связаны с непониманием различных статей, которые я читал, а также с неаккуратным кодом.

Я забыл указать тип возвращаемого значения для некоторых свойств, параметры «явный» и «строгий» были отключены, а в моем дизайнере были некоторые повреждения, и несколько столбцов были дублированы.

Мне больше всего понравилось следующее решение: http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Data/SafeBindingLists.cs . К сожалению, для этого требуется прокси-сервер Castle и более старая версия NHibernate.

Вот простое решение, которое я нашел:

Проблема в том, что вы не можете связать список с объектами нескольких типов. Цель состоит в том, чтобы иметь возможность напрямую задавать ComboBox значение свойства объекта, к которому он привязан с другим объектом.

Я решил использовать объект View и привязать к нему список.

Просмотр объекта:

Public Class OwnerView
    Private _owner As Owner

    Public ReadOnly Property OwnerId As Integer
        Get
            Return _owner.OwnerId
        End Get
    End Property

    Public ReadOnly Property OwnerName As String
        Get
            Return _owner.OwnerName
        End Get
    End Property

    Public ReadOnly Property OwnerAbbreviation As String
        Get
            Return _owner.OwnerAbbreviation
        End Get
    End Property

    Public Overridable ReadOnly Property Self As Owner
        Get
            Return _owner
        End Get
    End Property

    Public Sub New(ByVal owner As Owner)
        _owner = owner
    End Sub

End Class

Привязка:

With OwnerColumn
    .SortMode = DataGridViewColumnSortMode.Automatic
    .ReadOnly = False
    .Name = "OwnerColumn"
    .HeaderText = "Owner"

    Dim bs As New BindingSource()

    For Each co As Owner In Owners
        bs.Add(New OwnerView(co))
    Next

    .DataPropertyName = "Owner"
    .DataSource = bs
    .ValueMember = "Self"
    .DisplayMember = "OwnerName"

    ItemDataGridView.Columns.Add(OwnerColumn)
End With
person Origin    schedule 25.01.2012