DataGridView:如何让一些单元格无法选择?

Mik*_*onn 19 c# datagridview visual-studio-2010 winforms

如何让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;
    }
Run Code Online (Sandbox Code Playgroud)

但这会导致StackOverflow.什么条件和我需要放在哪里以防止这种情况?

Ich*_*ann 15

添加并评论了您询问的情况.

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;
    }       
}
Run Code Online (Sandbox Code Playgroud)


JYL*_*JYL 6

您可以使用事件"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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果你将gridView的MultiSelect属性保留为True,你可以自己管理一个具有不可选择单元格的"单选"网格视图:il单元格是可选择的,清除其他选择......