Disable Cell Highlighting in a datagridview

前端 未结 10 1879
后悔当初
后悔当初 2020-12-08 13:30

How to disable Cell Highlighting in a datagridview, Highlighting should not happen even if I click on the cell.

Any thoughts please

相关标签:
10条回答
  • 2020-12-08 13:57

    The ForeColor/BackColor kludge wasn't working for me, because I had cells of different colors. So for anyone in the same spot, I found a solution more akin to actually disabling the ability.

    Set the SelectionChanged event to call a method that runs ClearSelection

    private void datagridview_SelectionChanged(object sender, EventArgs e)
    {
        this.datagridview.ClearSelection();
    }
    
    0 讨论(0)
  • 2020-12-08 14:01
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged
        Me.DataGridView1.ClearSelection()
    End Sub
    

    That's it. But if you still want to get clicked row/cell index or to access values:

    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
    
    0 讨论(0)
  • 2020-12-08 14:01

    The answers I saw so far didn't give me exactly what I was looking for, but they showed me the right direction. In my case, after binding to a data source, the DGV selected and highlighted one cell, which I didn't want. I wanted to highlight only if the user selected the complete row.

    After a while I found the following solution, which is working fine for me:

    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;
        };
    }
    

    Note: In my example, I have set the properties

    MultiSelect = false, ReadOnly = true

    because I am using the DGV just to display search results.

    0 讨论(0)
  • 2020-12-08 14:06

    Did a quick websearch to find out how to make a datagridview selection non-selectable & got this (web page) hit.

    Calling ClearSelection on SelectionChanged can and does cause a double firing of the SelectionChanged event, at minimum.

    The first event is when the cell/row is selected and, of course, the SelectionChanged event is fired. The second firing is when ClearSelection is called as it causes (and logically so!) the selection of the datagridview to (again) changed (to no selection), thus firing SelectionChanged.

    If you have more code than simply ClearSelection going on, as such I do, you'll want to suppress this event until after your code is done. Here's an example:

     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;
    }
    
    0 讨论(0)
  • 2020-12-08 14:07

    The only way I've found to "disable" highlighting is to set the SelectionBackColor and the SelectionForeColor in the DefaultCellStyle to the same as the BackColor and ForeColor, respectively. You could probably do this programmatically on the form's Load event, but I've also done it in the designer.

    Something like this:

    Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
    Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
    
    0 讨论(0)
  • 2020-12-08 14:12

    in vb speak:

    Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
            datagridview1.ClearSelection()
    End Sub
    
    0 讨论(0)
提交回复
热议问题