.net DataGridViewCell-更改背景色而不丢失焦点
我有一个DataGridView,其中一列显示颜色。该列包含DataGridViewTextBox类型,我将其保留为空并更改Style.BackColor 当用户单击单元格时,我打开一个颜色对话框,并使用生成的颜色设置单元格的背景色。但是,如两个类似问题(和)中所述,在用户单击其他位置或执行DataGridView.CurrentCell.Selected=False的代码使单元格失去焦点之前,显示屏不会改变背景色 我想知道:在.NET中,当单元格失去焦点,可以重新绘制时,会发生什么情况?我可以直接调用它吗 取消选择单元格确实有效,但我希望避免这种情况,因为我希望保持该行处于选中状态,同时也不希望触发任何其他我不打算触发的事件 下面是我的代码(请注意,在网格刷新期间,CondColor列的选择高亮显示设置为透明):.net DataGridViewCell-更改背景色而不丢失焦点,.net,vb.net,datagridview,.net,Vb.net,Datagridview,我有一个DataGridView,其中一列显示颜色。该列包含DataGridViewTextBox类型,我将其保留为空并更改Style.BackColor 当用户单击单元格时,我打开一个颜色对话框,并使用生成的颜色设置单元格的背景色。但是,如两个类似问题(和)中所述,在用户单击其他位置或执行DataGridView.CurrentCell.Selected=False的代码使单元格失去焦点之前,显示屏不会改变背景色 我想知道:在.NET中,当单元格失去焦点,可以重新绘制时,会发生什么情况?我可以
注意:选择突出显示不会以任何方式模糊颜色单元格尝试此操作…为单元格背景设置颜色后,调用网格
EndEdit
,然后立即调用网格BeginEdit。
这将导致网格重新绘制并立即显示所选颜色,并将其保留为所选单元格
If sender.Columns(e.ColumnIndex).Name = "CondColor" Then
Dim item = sender.Rows(e.RowIndex).DataBoundItem
If Not IsDBNull(item("ColorInt")) Then
ColorDialog1.Color = Color.FromArgb(item("ColorInt"))
End If
ColorDialog1.ShowDialog()
item("ColorInt") = ColorDialog1.Color.ToArgb
sender.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = ColorDialog1.Color
DataGridConditions.EndEdit()
DataGridConditions.BeginEdit(False)
End If
另外,附带说明的是,仅当编译器
选项strict
设置为关闭时,发布的代码才会工作。
打开此选项是一种很好的做法。不幸的是,如果打开当前代码,它将抛出一些错误。只是想一想。我认为代码是可行的,但是颜色是隐藏的,因为当前单元格有突出显示的颜色。啊,通常情况下这是正确的,但是我忘了包括因为这个原因我从该列中删除了选择突出显示。我将把它添加到代码示例中。我同意LarsTech的观点。将这行代码添加到CellContentClick
event…DataGridConditions.Rows(e.RowIndex).Selected=False
的末尾,它应该显示正确的颜色。我猜颜色。transparent
可能不是那么透明。因此,首先,我特别不想取消选择单元格或行,如上所述。我试图找出当取消选择该行以重新绘制单元格时会发生什么,以便手动调用它。第二,你可以选择信不信由你,但我向你保证选择突出显示不会以任何方式覆盖单元格。我将为问题添加一个屏幕截图。您需要将SelectionBackColor
属性设置为相同的颜色。只需在最后一行后面添加:sender.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.SelectionBackColor=ColorDialog1.Color
,它应该可以工作。帮自己一个忙,选项必须严格遵守
。谢谢,但这不起作用。它确实调用了DataGridView.Paint事件,但单元格直到被取消选择后才改变颜色。在SelectionChanged事件中还发生了其他一些事情,可能会导致新的背景色值被正确绘制。我使用的代码与您发布的代码相同,添加了两行,如图所示,在我这一方有效。我不确定SelectionChanged
事件会如何影响这一点,选择没有改变。我希望您知道,调用RefreshCondGrid
将清除任何单元格颜色,除非颜色保存到DB。明白-只有在打开表单时才会调用。最终颜色将保存到DB中,但在测试中,暂时将其忽略是有用的
If sender.Columns(e.ColumnIndex).Name = "CondColor" Then
Dim item = sender.Rows(e.RowIndex).DataBoundItem
If Not IsDBNull(item("ColorInt")) Then
ColorDialog1.Color = Color.FromArgb(item("ColorInt"))
End If
ColorDialog1.ShowDialog()
item("ColorInt") = ColorDialog1.Color.ToArgb
sender.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = ColorDialog1.Color
DataGridConditions.EndEdit()
DataGridConditions.BeginEdit(False)
End If