在编辑另一个单元格时填充其他单元格
Populate other Cells while Another Cell is being Editted
我想做的是(只是一个例子),在输入 dgv 行 0,列 0 时,如果值 = 10,则 dgv 行 0,列 1 = 是。但是如果 dgv 行 0,列 0 值 = 100 那么 dgv 行 0,列 1 = No.
我希望在输入时 运行,因此 dgv 第 0 行第 1 列可以在我完成第 0 行第 0 列之前显示几个不同的值。
抱歉,如果这没有意义,我发现很难解释。这就是我一直无法在网上找到答案的原因。
我正在尝试 cellvaluechanged 事件,但它只会在我退出第 0 行第 0 列后更改第 0 行第 1 列,而不是在我输入时更改。
并且还尝试了 editiingcontrolshowing 事件,但我无法获取事件行和列索引。如果我能弄清楚如何获取行和列索引,我想我也许能让这个工作。
如有任何帮助,我们将不胜感激。
我认为这个问题是重复的。
查看此回答
TL;DR DataGridView.CurrentCellDirtyStateChanged 和 DataGridView.CellValueChanged 事件
Private Sub YourDGV_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs)
If YourDGV.CurrentCell.ColumnIndex = rateColumnIndex Then
YourDGV.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Private Sub YourDGV_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)
If e.ColumnIndex = rateColumnIndex Then
Dim cellAmount As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(amountColumnIndex)
Dim cellQty As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(qtyColumnIndex)
Dim cellRate As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(rateColumnIndex)
cellAmount.Value = CInt(cellQty.Value) * CInt(cellRate.Value)
End If
End Sub
使用 EditingControlShowing
事件的替代解决方案。
Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
Try
RemoveHandler e.Control.KeyUp, AddressOf UpdateAnotherColumnOnKeyUp
Catch ex As Exception
End Try
If Me.DataGridView1.CurrentCell.ColumnIndex = 0 Then
AddHandler e.Control.KeyUp, AddressOf UpdateAnotherColumnOnKeyUp
End If
End Sub
Private Sub UpdateAnotherColumnOnKeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs)
With DataGridView1.CurrentCell
Dim blnAnotherColumnValue As Boolean = False
If CType(sender, TextBox).Text = 10 Then
blnAnotherColumnValue = True
End If
DataGridView1.Rows(.RowIndex).Cells(1).Value = blnAnotherColumnValue
End With
End Sub
我想做的是(只是一个例子),在输入 dgv 行 0,列 0 时,如果值 = 10,则 dgv 行 0,列 1 = 是。但是如果 dgv 行 0,列 0 值 = 100 那么 dgv 行 0,列 1 = No.
我希望在输入时 运行,因此 dgv 第 0 行第 1 列可以在我完成第 0 行第 0 列之前显示几个不同的值。
抱歉,如果这没有意义,我发现很难解释。这就是我一直无法在网上找到答案的原因。
我正在尝试 cellvaluechanged 事件,但它只会在我退出第 0 行第 0 列后更改第 0 行第 1 列,而不是在我输入时更改。 并且还尝试了 editiingcontrolshowing 事件,但我无法获取事件行和列索引。如果我能弄清楚如何获取行和列索引,我想我也许能让这个工作。
如有任何帮助,我们将不胜感激。
我认为这个问题是重复的。
查看此回答
TL;DR DataGridView.CurrentCellDirtyStateChanged 和 DataGridView.CellValueChanged 事件
Private Sub YourDGV_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs)
If YourDGV.CurrentCell.ColumnIndex = rateColumnIndex Then
YourDGV.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Private Sub YourDGV_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs)
If e.ColumnIndex = rateColumnIndex Then
Dim cellAmount As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(amountColumnIndex)
Dim cellQty As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(qtyColumnIndex)
Dim cellRate As DataGridViewTextBoxCell = YourDGV.Rows(e.RowIndex).Cells(rateColumnIndex)
cellAmount.Value = CInt(cellQty.Value) * CInt(cellRate.Value)
End If
End Sub
使用 EditingControlShowing
事件的替代解决方案。
Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
Try
RemoveHandler e.Control.KeyUp, AddressOf UpdateAnotherColumnOnKeyUp
Catch ex As Exception
End Try
If Me.DataGridView1.CurrentCell.ColumnIndex = 0 Then
AddHandler e.Control.KeyUp, AddressOf UpdateAnotherColumnOnKeyUp
End If
End Sub
Private Sub UpdateAnotherColumnOnKeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs)
With DataGridView1.CurrentCell
Dim blnAnotherColumnValue As Boolean = False
If CType(sender, TextBox).Text = 10 Then
blnAnotherColumnValue = True
End If
DataGridView1.Rows(.RowIndex).Cells(1).Value = blnAnotherColumnValue
End With
End Sub