在datagridview中禁用单元格高亮显示

如何在datagridview中禁用单元格高亮,即使点击单元格,高亮也不应该发生。

请任何想法

我发现“禁用”突出显示的唯一方法是将DefaultCellStyleSelectionBackColorSelectionForeColor分别设置为与BackColorForeColor相同。 你也许可以在窗体的Load事件上以编程的方式做到这一点,但我也在devise器中做到这一点。

像这样的东西:

 Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor 

ForeColor / BackColor kludge不适合我,因为我有不同颜色的单元格。 所以对于同一个地方的任何人来说,我发现了一个更类似于禁用这个能力的解决scheme。

SelectionChanged事件设置为调用运行ClearSelection的方法

 private void datagridview_SelectionChanged(object sender, EventArgs e) { this.datagridview.ClearSelection(); } 

做了一个快速的networkingsearch,以了解如何使datagridviewselect不可选&得到这个(网页)命中。

在SelectionChanged上调用ClearSelection可以并至less导致SelectionChanged事件的双重触发。

第一个事件是当单元格/行被选中,当然,SelectionChanged事件被触发。 第二次触发是当ClearSelection被调用,因为它导致(和逻辑上!)select的datagridview(再次)改变(不选),从而发射SelectionChanged。

如果你有更多的代码而不是简单的ClearSelection继续,那么我们直到你的代码完成之后,你才想压制这个事件。 这是一个例子:

  private void dgvMyControl_SelectionChanged(object sender, EventArgs e) { //suppresss the SelectionChanged event this.dgvMyControl.SelectionChanged -= dgvMyControl_SelectionChanged; //grab the selectedIndex, if needed, for use in your custom code // do your custom code here // finally, clear the selection & resume (reenable) the SelectionChanged event this.dgvMyControl.ClearSelection(); this.dgvMyControl.SelectionChanged += dgvMyControl_SelectionChanged; } 

最简单的方法来处理不同颜色的单元格,而不需要重新定义任何事件,那就是做这样的事情:

 private void dgvMyControl_SelectionChanged(object sender, EventArgs e) { dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.SelectionBackColor = dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.BackColor } 

如果您允许多个select,您将需要放置一个迭代器

(编辑)

实际上,这需要在数据人口的时候完成。 它似乎没有在select更改的方法中工作。 所以在将数据填充到表格之后,您需要遍历单元格并更改其选定的背景以匹配其正常的背景。 就像这样(语法可能有点closures,我从我的VB代码转换它):

 foreach (datarow r in dgv.rows) { foreach (datacell c in r.cells) { c.Style.SelectionBackColor = c.Style.BackColor } } 

乱七八糟,这也是有效的,因为我只想在单击单元格时更改第二列中的单元格背景色:

  Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Dim row As Integer = DataGridView1.CurrentCellAddress.Y Dim column As Integer = DataGridView1.CurrentCellAddress.X If column = 1 Then Me.DataGridView1.CurrentCell.Selected = False DataGridView1.Item(column, row).Style.BackColor = SelectColour() End If End Sub 
 Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged Me.DataGridView1.ClearSelection() End Sub 

而已。 但是,如果你仍然想获得点击行/单元格索引或访问值:

 Private Sub DataGridView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown Dim _ht As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(eX, eY) If _ht.Type = DataGridViewHitTestType.Cell Then Me.DataGridView1.Rows(_ht.RowIndex).Cells(_ht.ColumnIndex).Value = _ "RowIndex = " & _ht.RowIndex & ", " & "ColumnIndex = " & _ht.ColumnIndex End If End Sub