DataGridView: как сделать некоторые ячейки недоступными?
Как сделать некоторые ячейки в DataGridView недоступными?
Под "невыбираемым" я имею в виду: его нельзя выбрать каким-либо образом, и попытка выбрать его не будет отменять выбор другой ячейки.
Я не имею в виду ReadOnly
. Мои ячейки уже имеют это свойство как истинное.
DataGridView.MultiSelect
должно быть ложным.
Благодаря ответу JYL я написал код:
private int selectedCellRow = 0;
private int selectedCellColumn = 0;
private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected)
return;
if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1)
{
e.Cell.Selected = false;
grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true;
}
else
{
selectedCellRow = e.Cell.RowIndex;
selectedCellColumn = e.Cell.ColumnIndex;
}
//this was only for seeing what is happening
//this.Text = selectedCellRow + " " + selectedCellColumn;
}
Но это приводит к StackOverflow. Какое условие и где мне нужно поставить, чтобы предотвратить это?
Ответы
Ответ 1
Добавлено и прокомментировано условие, о котором вы спрашивали.
private int selectedCellRow = 0;
private int selectedCellColumn = 0;
private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected)
return;
//if Cell that changed state is to be selected you don't need to process
//as event caused by 'unselectable' will select it again
if (e.Cell.RowIndex == selectedCellRow && e.Cell.ColumnIndex == selectedCellColumn)
return;
//this condition is necessary if you want to reset your DataGridView
if (!e.Cell.Selected)
return;
if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1)
{
e.Cell.Selected = false;
grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true;
}
else
{
selectedCellRow = e.Cell.RowIndex;
selectedCellColumn = e.Cell.ColumnIndex;
}
}
Ответ 2
Вы можете использовать событие "CellStateChanged".
private void DataGridViewXYZ_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if (e.Cell == null
|| e.StateChanged != DataGridViewElementStates.Selected)
return;
if (! [condition here : can this cell be selectable ?])
e.Cell.Selected = false;
}
ИЗМЕНИТЬ: если вы оставите свойство MultiSelect gridView равным True, вы можете управлять сетью с однократным выбором с невыбранными ячейками: il ячейка выбирается, очищает другой выбор...
Ответ 3
Я считаю, что эта статья может оказаться полезной для вас:
http://blog.spencen.com/2009/04/25/readonly-rows-and-cells-in-a-datagrid.aspx
Свойство ReadOnly
может применяться ко всей сетке, столбцу, строке или отдельной ячейке.