1

私のフォームには、いくつかの DataGridViewComboBoxColumns といくつかの ComboBoxes を持つ DataGridView があります。DataGridView は BindingSource にバインドされ、各 ComboBox の SelectedItem プロパティは DataGridView の対応する列にバインドされます。DataGridViewComboBoxColumns と ComboBoxes のペアは、項目に対して同じ DataSource を持ちます。

予想される動作は、グリッド内の行を変更すると、対応する列と新しく選択された行の値が ComboBoxes に反映されることです。何が起こるかというと、ComboBoxes は以前に選択された行に従って (つまり、1 ステップ遅れて) 変化し、新しく選択された行の DataGridViewComboBoxColumns が最後の行のクローンになります。

他のそのようなペアでも同じ機能を使用できますが、違いは、それらの DataSource がデータベースにバインドされ、代わりに SelectedValue プロパティが使用されることです。

4

1 に答える 1

1

SelectedItem の代わりに SelectedValue プロパティを使用して解決しました。このプロパティを使用できるようにするには、ComboBox の .ValueMember を設定する必要があるため、ComboBox アイテムのリストで単純な文字列ではなく、プロパティを持つオブジェクトを使用する必要がありました。クラスを作成しました:

Public Class ComboItem
    Private cText As String
    Private cValue As Object
    Public Sub New(ByVal text As String, ByVal value As Object)
        Me.cText = text
        Me.cValue = value
    End Sub
    Public Sub New(ByVal text As String)
        Me.cText = text
        Me.cValue = text
    End Sub

    Public Property value() As Object
        Get
            Return cValue
        End Get
        Set(ByVal value As Object)
            cValue = value
        End Set
    End Property

    Public Property text() As String
        Get
            Return cText
        End Get
        Set(ByVal value As String)
            cText = value
        End Set
    End Property
End Class

そして、次のようにバインディングを設定します。

Dim itemList As List(Of ComboItem) = New List(Of ComboItem) From {New ComboItem("", DBNull.Value),
                                                                  New ComboItem("Item 1"),
                                                                  New ComboItem("Item 2")}

Dim bindingSource As BindingSource = New BindingSource
bindingSource.DataSource = itemList
ComboBox1.DataSource = bindingSource
ComboBox1.DisplayMember = "text"
ComboBox1.ValueMember = "value"
dataGridViewTextBoxColumn.DataSource = bindingSource
dataGridViewTextBoxColumn.DisplayMember = "text"
dataGridViewTextBoxColumn.ValueMember = "value"

デザイナーから SelectedValue バインディングを設定しましたが、コードは次のようになります。

ComboBox1.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", dataGridViewBindingSource, "ColumnName", True))

私の知る限り、SelectedItem メソッドは同じように機能するはずなので、この回答は実際には回避策に似ています (間違っている場合は修正してください!)。

于 2013-06-21T09:15:27.777 に答える