在 datagridview 中禁用单元格突出显示

Posted

技术标签:

【中文标题】在 datagridview 中禁用单元格突出显示【英文标题】:Disable Cell Highlighting in a datagridview 【发布时间】:2010-12-17 05:54:55 【问题描述】:

如何, 即使我单击单元格,也不会发生突出显示。

大家有什么意见

【问题讨论】:

【参考方案1】:
<DataGrid ItemsSource="Binding Credits" x:Name="Grid"
                          HorizontalAlignment="Left" RowBackground="Transparent">

【讨论】:

【参考方案2】:

到目前为止,我看到的答案并没有准确地告诉我我在寻找什么,但它们为我指明了正确的方向。就我而言,在绑定到数据源后,DGV 选择并突出显示了一个我不想要的单元格。 我只想在用户选择完整行时突出显示。

一段时间后,我找到了以下解决方案,对我来说效果很好:

private void datagridview_SelectionChanged(object sender, EventArgs e)
       
    var dgv = (DataGridView)sender;
    if (dgv.SelectedCells.Count == 1)
       // hide selection for the single cell
        dgv.DefaultCellStyle.SelectionBackColor = dgv.DefaultCellStyle.BackColor;
        dgv.DefaultCellStyle.SelectionForeColor = dgv.DefaultCellStyle.ForeColor;
    
    else
       // show the selected cells
        dgv.DefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.SelectionBackColor;
        dgv.DefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.SelectionForeColor;
    ;

注意:在我的示例中,我设置了属性

MultiSelect = false,ReadOnly = true

因为我使用 DGV 只是为了显示搜索结果。

【讨论】:

【参考方案3】:
Private Sub DGW2_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DGW2.DataBindingComplete
    Dim mygrid As DataGridView
    mygrid = CType(sender, DataGridView)
    mygrid.ClearSelection()
End Sub

【讨论】:

【参考方案4】:

用vb说话:

Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
        datagridview1.ClearSelection()
End Sub

【讨论】:

【参考方案5】:
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(e.X, e.Y)
    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

【讨论】:

【参考方案6】:

搞砸了,这也有效,因为我只想在单击单元格时更改第二列中的单元格背景颜色:

        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

【讨论】:

【参考方案7】:

处理具有不同颜色的单元格的最快方法是无需重新触发任何事件,可以执行以下操作:

private void dgvMyControl_SelectionChanged(object sender, EventArgs e)

    dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.SelectionBackColor = dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.BackColor


如果您允许多项选择,则需要放入迭代器

(编辑)

实际上,这需要在数据填充时完成。它似乎不适用于 on selection changed 方法。因此,在将数据填充到表格中之后,您需要遍历单元格并更改它们选择的背景以匹配它们的正常背景。像这样的东西(语法可能有点不对,我正在从我的 vb 代码转换它):

foreach (datarow r in dgv.rows)

  foreach (datacell c in r.cells)
  
     c.Style.SelectionBackColor = c.Style.BackColor
  

【讨论】:

【参考方案8】:

进行了一次快速的网络搜索,以了解如何使 datagridview 选择不可选择并获得此(网页)点击。

在 SelectionChanged 上调用 ClearSelection 至少可以而且确实会导致 SelectionChanged 事件的双重触发。

第一个事件是当单元格/行被选中时,当然,SelectionChanged 事件被触发。 第二次触发是当 ClearSelection 被调用时,因为它导致(逻辑上如此!)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;

【讨论】:

【参考方案9】:

ForeColor/BackColor kludge 对我不起作用,因为我有不同颜色的单元格。因此,对于同一地点的任何人,我找到了一个更类似于实际禁用该能力的解决方案。

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

private void datagridview_SelectionChanged(object sender, EventArgs e)

    this.datagridview.ClearSelection();

【讨论】:

问题是vb.net vb.net 需要进行微小的修改,但这很好用。谢谢你。我不明白为什么没有一个简单的属性可以在控件上打开或关闭。 我希望“ClearSelection()”再次触发“SelectionChanged”事件。 ......但事实并非如此。奇怪。【参考方案10】:

我发现“禁用”突出显示的唯一方法是将DefaultCellStyle 中的SelectionBackColorSelectionForeColor 分别设置为与BackColorForeColor 相同。您可能可以在表单的 Load 事件上以编程方式执行此操作,但我也在设计器中完成了此操作。

类似这样的:

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

【讨论】:

如果某些单元格的颜色与默认背景颜色不同,这将不起作用。 如果你循环遍历行,设置颜色,你也可以在同一个循环中设置选择颜色。然后它工作得很好。更一般地说,您可以在设置正常颜色时随时设置选择颜色。 我真的不喜欢我必须使用这个,但它运作良好:)

以上是关于在 datagridview 中禁用单元格突出显示的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 UITableViewCell 突出显示?

在 datagridview 上启用“多选”

如何在 c# 中禁用可点击的 datagridview 中的空单元格

选择单元格时,更改 QTableView 中图标的颜色突出显示

DataGridView使用技巧十二:DataGridView Error图标表示的设定

Datagridview全行选择但获得单个单元格值