在VB .Net 3.5中,是否可以将DataGridViewCell(未绑定)的颜色更改为其他颜色,在失去焦点或离开单元格之前让单元格明显改变?我有一个正在运行的计时器,用于查询存在的数据,我希望颜色立即更改,而不是在用户离开单元格后。
我已经尝试了DataGridView.Refresh和Me.Refresh,但没有得到结果。
我做错了什么? (下面是我用来改变背景的代码)
''' <summary>
''' Sets or clears the passed cells background to Red
''' </summary>
''' <param name="ColumnNumber">Datagridview column index of the cell to be changed</param>
''' <param name="RowNumber">Datagridview row index of the cell to be changed</param>
''' <param name="Error">Indicate whether the cell should be red, <c>True</c>, or empty, <c>False</c></param>
Private Sub Error_Cell(ByVal ColumnNumber As Integer, ByVal RowNumber As Integer, ByVal [Error] As Boolean)
If [Error] Then
Me.dgvMain.Rows(RowNumber).Cells(ColumnNumber).Style.BackColor = Color.Red
Else
Me.dgvMain.Rows(RowNumber).Cells(ColumnNumber).Style.BackColor = Color.Empty
End If
Me.dgvMain.Refresh()
Me.Refresh()
End Sub
答案 0 :(得分:0)
首先,您必须解释自己何时使用不同的颜色绘制行,例如在我的情况下(当用户点击CheckBoxCell时) 然后,尝试使用像CellLeave或CellContentClick这样的差异事件(作为我的例子): 最后,玩代码!
void updateCellStyle_DataGridViewCellEventArgs(object sender, DataGridViewCellEventArgs e){
int index = e.RowIndex;
if (index == -1)
return;
else {
DataGridView dgv = sender as DataGridView;
int vCHK = e.ColumnIndex; //this is the checkbox column
if (vCHK != 0)
return;
else {
DataGridViewCheckBoxCell temp = (DataGridViewCheckBoxCell)dgv.Rows[index].Cells[0];
if ((bool)temp.EditedFormattedValue == true) {
DataGridViewTextBoxCell xrow = (DataGridViewTextBoxCell)dgv.Rows[index].Cells[3];
xrow.OwningRow.DefaultCellStyle.BackColor = Color.Wheat;
/*
other operations
*/
}
else {
temp.OwningRow.DefaultCellStyle.BackColor = Color.White;
/*
other operations
*/
}
答案 1 :(得分:0)
我决定只需更改当前单元格背景颜色并开始使用DataGridViewCell的EditControl。
为了捕获这个,我不得不在DataGridView事件“EditControlShowing”上获取EditControl(Type DataGridViewTextBoxEditingContorl)并将单元格EditControl与本地表单变量相关联,然后向TextChagned事件添加处理程序(因为Cells TextChanged)在编辑完成之后才会发生)。 (第一程序)。
执行此操作后,我可以通过更改EditControls BackColor来更改单元格的颜色,后者会立即更改。 (第二程序)
我必须在DataGridViews CellEndEdit事件上释放EditControl才能重用我的私有变量。 (第三程序)
由于使用情况的变化,我没有测试过尝试更改行,但似乎工作正常。我希望这可以帮助任何有类似问题的人。如果有更有效的方法,请告诉我!
Private EditingControl As DataGridViewTextBoxEditingControl
Private Sub dgvMain_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvMain.EditingControlShowing
If TypeOf (e.Control) Is DataGridViewTextBoxEditingControl Then
EditingControl = DirectCast(e.Control, DataGridViewTextBoxEditingControl)
If DirectCast(e.Control, DataGridViewTextBoxEditingControl).EditingControlDataGridView.CurrentCell.OwningColumn Is PartNumber Then
AddHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged
End If
End If
End Sub
Private Sub Error_Cell(ByVal [Error] As Boolean)
If [Error] Then
If EditingControl IsNot Nothing Then EditingControl.BackColor = Color.Red
Else
If EditingControl IsNot Nothing Then EditingControl.BackColor = Color.Empty
End If
Me.dgvMain.Refresh()
End Sub
Private Sub dgvMain_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvMain.CellEndEdit
If EditingControl IsNot Nothing Then
RemoveHandler EditingControl.TextChanged, AddressOf EditingControl_TextChanged
End If
EditingControl = Nothing
End Sub
注意:我删除了If / Then中的许多步骤以保护无辜者,否则,他们会尽可能内联。