Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DataGridViewCell-更改背景色而不丢失焦点_.net_Vb.net_Datagridview - Fatal编程技术网

.net DataGridViewCell-更改背景色而不丢失焦点

.net DataGridViewCell-更改背景色而不丢失焦点,.net,vb.net,datagridview,.net,Vb.net,Datagridview,我有一个DataGridView,其中一列显示颜色。该列包含DataGridViewTextBox类型,我将其保留为空并更改Style.BackColor 当用户单击单元格时,我打开一个颜色对话框,并使用生成的颜色设置单元格的背景色。但是,如两个类似问题(和)中所述,在用户单击其他位置或执行DataGridView.CurrentCell.Selected=False的代码使单元格失去焦点之前,显示屏不会改变背景色 我想知道:在.NET中,当单元格失去焦点,可以重新绘制时,会发生什么情况?我可以

我有一个DataGridView,其中一列显示颜色。该列包含DataGridViewTextBox类型,我将其保留为空并更改Style.BackColor

当用户单击单元格时,我打开一个颜色对话框,并使用生成的颜色设置单元格的背景色。但是,如两个类似问题(和)中所述,在用户单击其他位置或执行DataGridView.CurrentCell.Selected=False的代码使单元格失去焦点之前,显示屏不会改变背景色

我想知道:在.NET中,当单元格失去焦点,可以重新绘制时,会发生什么情况?我可以直接调用它吗

取消选择单元格确实有效,但我希望避免这种情况,因为我希望保持该行处于选中状态,同时也不希望触发任何其他我不打算触发的事件

下面是我的代码(请注意,在网格刷新期间,CondColor列的选择高亮显示设置为透明):


注意:选择突出显示不会以任何方式模糊颜色单元格

尝试此操作…为单元格背景设置颜色后,调用网格
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