0

ユーザーがレポートを選択して表示/編集できるようにする GUI があります。ユーザーがレポートを選択すると、レポート内のアイテムが表示されます。Item には多くのプロパティがあり、そのほとんどは適切にバインドされています。プロパティの 1 つは Owner で、これは ComboBoxColumn にバインドされています。

  • 報告
    • アイテム
      • オーナー

これと非常によく似たことを数回行いましたが、、、、および を設定しても問題はありませんでしDataPropertyNameた。唯一の違いは、今度は型が を持つのではなく、実際にはオブジェクトのインスタンスを持つことです。DataSourceValueMemberDisplayMemberItemOwnderIDOwner

別の投稿で、リストにバインドされたアイテムに自己参照プロパティを与えることでこの問題を解決するという提案を見ました。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上の機能をプロパティにすることによって。ただし、これはかなりハッキリしているように見えます-それでも適切に機能しないため、基本的なことを誤解していると思います。どんな助けでも大歓迎です。OwnerOwnerName

4

1 に答える 1

0

私のエラーの多くは、読んださまざまな記事やずさんなコードの誤解から来ていることがわかりました。

いくつかのプロパティで戻り値の型を指定するのを怠り、オプションの明示的オプションと厳密なオプションの両方がオフになり、デザイナーに何らかの破損があり、いくつかの列が重複していました。

私が最も気に入った解決策は、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
于 2012-01-25T04:25:26.690 に答える