it-swarm.com.ru

Отключить выделение ячеек в сетке данных

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

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

41
Ramji

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

Что-то вроде этого:

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

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

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

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

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

Вызов 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;
}
4
KCromm

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

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

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

(Правка)

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

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

в вб говорят

Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
        datagridview1.ClearSelection()
End Sub
2
Coder22
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
LowLevel

Возиться, и это тоже работает, так как я хочу изменить цвет фона ячейки только во 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
1
Data
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
0
DrSerhat