DataGridViewCell背景颜色变化而不会失去焦点

时间:2009-09-16 15:34:38

标签: vb.net .net-3.5 datagridview

在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

2 个答案:

答案 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中的许多步骤以保护无辜者,否则,他们会尽可能内联。