Как отключить выделение ячеек в datagridview, Выделение не должно происходить, даже если я нажимаю на ячейку.
Любые мысли, пожалуйста,
Как отключить выделение ячеек в datagridview, Выделение не должно происходить, даже если я нажимаю на ячейку.
Любые мысли, пожалуйста,
Единственный способ, которым я нашел выделение "отключить", - установить SelectionBackColor
и SelectionForeColor
в DefaultCellStyle
так же, как и BackColor
и ForeColor
, соответственно. Возможно, вы могли бы сделать это программно в событии формы Load
, но я также сделал это в дизайнере.
Что-то вроде этого:
Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
Ключ ForeColor/BackColor не работал у меня, потому что у меня были ячейки разных цветов. Поэтому для тех, кто находится в одном и том же месте, я нашел решение, более похожее на фактическое отключение этой возможности.
Задайте событие SelectionChanged
для вызова метода, который запускает ClearSelection
private void datagridview_SelectionChanged(object sender, EventArgs e)
{
this.datagridview.ClearSelection();
}
Был ли быстрый поиск в Интернете, чтобы узнать, как сделать выбор datagridview неизменным и получить эту (веб-страницу).
Вызов ClearSelection на SelectionChanged может и вызывает двойное срабатывание события 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;
}
в VB говорят:
Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
datagridview1.ClearSelection()
End Sub
Самый быстрый способ сделать это для обработки ячеек с разными цветами, не требуя повторения каких-либо событий, - это сделать что-то вроде этого:
Дел >
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
}
}
Беседа, и это также работает, так как я хочу изменить цвет фона ячейки во втором столбце при нажатии на ячейку:
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(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
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
Ответы, которые я видел до сих пор, не дали мне именно то, что я искал, но они показали мне правильное направление. В моем случае после привязки к источнику данных 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 только для отображения результатов поиска.