DataGridViewのComboBoxColumnにオブジェクトのコレクションをバインドする
-
12-11-2019 - |
質問
私はユーザーが表示/編集するレポートを選択できるGUIを持っています。ユーザーがレポートを選択すると、レポート内の項目が表示されます。アイテムには多くのプロパティがあります - そのほとんどは正しくバインドされています。プロパティの1つは所有者であり、これは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
プロパティを表示します。これはかなりハッキーだと思われます - そして私はまだ正しく機能しないので基本的なものを誤解していると思います。あらゆる助けが大いに評価されます。
- 所有者
- アイテム
解決
私の誤解が私の誤解から多くの誤解が来たことを発見しました。
i refrest of propertiesのいくつかのプロパティで戻り値を指定して、オプションの明示/オプション厳格なしで、私のデザイナーには破損していて、いくつかの列が重複していました。
これへの解決策は、次のとおりです。 "rel=" nofollow "> http://code.google.com/p/systembusinessObjects/source/browse/trunk/system.businessObjects.framework/data / safebindinglists.cs 。残念ながら、これには城の代理が必要で、古いバージョンのNhibernate。
これは私が見つけた単純な解決策です:
問題は、複数の型のオブジェクトを含むリストをバインドできないことです。目標は、ComboBoxが別のオブジェクトとバインドされているオブジェクトのプロパティの値を直接設定できるようにすることです。
ビューオブジェクトを使用し、リストをそのリストにバインドすることを選択しました。
ビューオブジェクト:
.
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