Отключить выделение ячеек в представлении данных - PullRequest
41 голосов
/ 17 ноября 2009

Как отключить подсветку ячеек в просмотре данных, Выделение не должно произойти, даже если я нажму на ячейку.

Любые мысли, пожалуйста

Ответы [ 8 ]

98 голосов
/ 22 января 2011

Кладж ForeColor / BackColor у меня не работал, потому что у меня были клетки разных цветов. Поэтому для всех, кто находился в одном месте, я нашел решение, более похожее на фактическое отключение способности.

Установите событие SelectionChanged для вызова метода, который запускается ClearSelection

private void datagridview_SelectionChanged(object sender, EventArgs e)
{
    this.datagridview.ClearSelection();
}
62 голосов
/ 17 ноября 2009

Единственный способ, которым я нашел «отключение» подсветки, - установить SelectionBackColor и SelectionForeColor в DefaultCellStyle на значения BackColor и ForeColor соответственно. Возможно, вы могли бы сделать это программно на событии Load формы, но я также сделал это в конструкторе.

Примерно так:

Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
5 голосов
/ 22 августа 2011

Сделал быстрый веб-поиск, чтобы выяснить, как сделать выбор из таблицы данных невыбираемым, и получил эту (веб-страницу) хит.

Вызов ClearSelection для SelectionChanged может и вызывает двойное срабатывание события SelectionChanged, как минимум.

Первое событие - это когда ячейка / строка выбрана и, конечно же, событие SelectionChanged сработало. Второе срабатывание - это когда ClearSelection вызывается так, как это вызывает (и логически так!) Выбор представления сетки данных, чтобы (снова) изменить (без выбора), тем самым запустив 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;
}
3 голосов
/ 07 марта 2018

в VB говорят:

Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
        datagridview1.ClearSelection()
End Sub
2 голосов
/ 17 октября 2012

Самый быстрый способ сделать это для обработки ячеек с разными цветами, без необходимости переопределять какие-либо события, это сделать что-то вроде этого:

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

}
Вам нужно будет вставить итератор, если вы разрешаете множественный выбор

(EDIT)

на самом деле, это нужно сделать вовремя для заполнения данных. По-видимому, он не работает в методе изменения выбора. Поэтому после заполнения данных в таблице необходимо выполнить итерацию по ячейкам и изменить выбранный фон, чтобы он соответствовал их обычному фону. Примерно так (синтаксис может быть немного неправильным, я конвертирую его из моего VB-кода):

foreach (datarow r in dgv.rows)
{
  foreach (datacell c in r.cells)
  {
     c.Style.SelectionBackColor = c.Style.BackColor
  }
}
1 голос
/ 26 января 2015
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
1 голос
/ 26 ноября 2012

Возиться, и это тоже работает, так как я хочу изменить цвет фона ячейки только во 2-м столбце при нажатии на ячейку:

        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
0 голосов
/ 03 июня 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...