DataGridView: как сделать некоторые ячейки недоступными для выбора? - PullRequest
19 голосов
/ 16 декабря 2010

Как я могу сделать некоторые ячейки в DataGridView невыбираемыми?

Под «невыбираемым» я подразумеваю: его нельзя никоим образом выбрать, и попытка выделить его не отменяет выбор любой другой ячейки.

Я не имею в виду ReadOnly. Мои клетки уже имеют это свойство как true.

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. Какое условие и где я должен поставить, чтобы предотвратить это?

Ответы [ 3 ]

15 голосов
/ 16 декабря 2010

Добавил и прокомментировал условие, о котором вы спрашивали.

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;
    }       
}
6 голосов
/ 16 декабря 2010

Вы можете использовать событие «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, вы сможете управлять сетевым представлением «один выбор» с невыбираемыми ячейками: если ячейка выбираема, снимите другой выбор ...

1 голос
/ 16 декабря 2010

Я считаю, что эта статья может оказаться полезной для вас:

http://blog.spencen.com/2009/04/25/readonly-rows-and-cells-in-a-datagrid.aspx

Свойство ReadOnly можно применять ко всей сетке, столбцу, строке или отдельному человекуклетка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...