1

vb.net と winforms を使用しています。

バインドされた DataGridView を持つフォームがあります。DGV には、ComboBox を含む 5 つの列があります。EditingControlShowing Even を使用して、ComboBox の選択をキャッチしています。(以下のコードを参照)。問題は次のとおりです。

ComboBox でセルをクリックして選択を行い、基になるセル (セル = 選択された値) を更新してから、DGV の別の行をクリックすると、うまくいきません。Cell を更新した後、DataSource の対応する行で EndEdit を実行すると、うまくいくように見えます。

これを自動化できるように、対応するデータ ソース行を特定するにはどうすればよいですか?

Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) _
                Handles DataGridView1.EditingControlShowing
        Try
            Debug.Print("entered the EditingControlShowing")
            Dim ColName As String = Me.DataGridView1.Columns(Me.DataGridView1.CurrentCell.ColumnIndex).Name
            If ColName = "Col1" Then 'Or ColName = "Col2" Or ColName = "Col3" Or ColName = "Col4" Or ColName = "Col5" Then

'the column you want to cast
        Dim cmb As ComboBox = TryCast(e.Control, ComboBox)
            RemoveHandler cmb.SelectedIndexChanged, AddressOf cmb_SelectedIndexChanged
            AddHandler cmb.SelectedIndexChanged, AddressOf cmb_SelectedIndexChanged
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Sub cmb_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    Try
        Me.DataGridView1.Rows(Me.DataGridView1.CurrentRow.Index).Cells(Me.DataGridView1.CurrentCell.ColumnIndex).Value = CType(sender, ComboBox).SelectedItem
        '
        ' HERE IF I PUT MyDataSet.Tables(0).Rows(?).EndEding it works - but how to konw what row?
        '
        UpdateAvgColumn(Me.DataGridView1.CurrentRow.Index)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
4

1 に答える 1

0

発生したイベントが再入力されます。現在イベントを処理している場合は、他のイベントを処理しないように注意する必要があります。別のイベントが処理されている場合、コードの実行をスキップするには、イベントの処理の周りに IF ステートメントを配置する必要があります。

sub dgv_selecteditemchanged()
  If not processing_event
    processing_event = true
    ...
    processing_event = false
  end if
end sub
于 2011-03-09T16:05:50.830 に答える