Привязка коллекции объектов к ComboboxColumn в DataGridView - PullRequest
0 голосов
/ 24 января 2012

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

  • Отчет
    • Элементы
      • Владелец

Я делал что-то очень похожее на это несколько раз, и у меня не было проблем при установке 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.Это кажется довольно глупым - и я думаю, что я неправильно понимаю что-то фундаментальное, так как оно все еще не работает должным образом.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 25 января 2012

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

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

Решение, которое мне понравилось больше всего, было: 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
...