0

私はこれを持っDataGridViewておりDataGridViewTextBoxColumn、ユーザーが数字を入力できる場所があり、彼が入力した後、検索を実行してその番号の下の以前のレコードを見つけます。

このレコードを表示して、ユーザーがそれらのいずれかを選択できるようにするか、値を入力したままにします。つまり、新しいレコードを作成したいということです。

そのために、ユーザーが入力を終了したときに、各DataGridViewTextBoxCellfor aをこれらのオプションに置き換えたいと思います。DataGridViewComboBoxCell

ただし、この置換を実行しようとすると、この例外が発生します: System.Windows.Forms.dll の「System.InvalidOperationException」。追加情報: 関数 SetCurrentCellAddressCore への呼び出しが再入力されるため、操作は無効です。

これが私のコードです(私はすでにCellLeave代わりに処理しようとしましたCellValidated):

Private Sub DataGridViewDebitos_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewDebitos.CellValidated
    DataGridViewDebitos.EndEdit(DataGridViewDataErrorContexts.Commit)
    If e.ColumnIndex = ColumnDebito.Index Then
        Dim cellDebito = DataGridViewDebitos.Rows(e.RowIndex).Cells(ColumnDebito.Index)
        Dim numDebito = String.Concat(If(cellDebito.Value, "").ToString.Where(Function(c) Char.IsLetterOrDigit(c)))
        If TypeOf cellDebito Is DataGridViewTextBoxCell AndAlso numDebito.Length >= 3 Then
            Dim prcsa As New List(Of JObject) 'In real version, prcsa is populated by an external function, but it doesn't affect the result
            Dim j = New JObject
            j.SetProperty("id", 0)
            j.SetProperty("nome", cellDebito.Value)
            prcsa.Insert(0, j) 'This option is always present, it allows user to keep simply what was typed
            'Exception hapens here
            DataGridViewDebitos(cellDebito.ColumnIndex, cellDebito.RowIndex) =
                New DataGridViewComboBoxCell With {
                    .DataSource = prcsa,
                    .DisplayMember = "nome",
                    .FlatStyle = FlatStyle.Flat,
                    .ValueMember = "id",
                    .Value = prcsa(0).Value(Of Integer)("id")}
        End If
    End If
End Sub

どうもありがとうございました

4

1 に答える 1