DataGridView:如何使某些单元格无法选择?

Posted

技术标签:

【中文标题】DataGridView:如何使某些单元格无法选择?【英文标题】:DataGridView: How to make some cells unselectable? 【发布时间】:2011-05-26 13:27:11 【问题描述】:

如何使 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;
    

但这会导致 ***。为了防止这种情况,我需要在什么条件和位置放置?

【问题讨论】:

您的意思是不可编辑吗?像某些单元格是只读的? 【参考方案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;
           

【讨论】:

轻微改进可能是通过e.Cell.DataGridView 引用调用DataGridView 而不是使用grid。无论哪种方式,事件都需要通过选定的列和行索引进行一些“外部帮助”。很好的解决方案。【参考方案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;

编辑:如果您将 gridView 的 MultiSelect 属性保留为 True,您可以自己管理一个带有不可选择单元格的“单选”gridview:如果单元格是可选的,请清除其他选择...

【讨论】:

我认为这会阻止单元格被选中,但不会阻止前一个单元格被取消选择。 使用 multiselect 为 true 你对我的代码没有问题......因为当你点击另一个单元格时,Multiselect 为 true 不会取消选择一个单元格。编辑:您的一般情况出现在我的样本中...... 它工作正常,只是在单击“不可选择”后仍然取消选择“可选择”单元格 你有一个不幸的“datagridview.ClearSelection()”吗? 对该解决方案的“破解”可能是将当前选定的单元格存储为变量,然后在不应该更改单击的单元格时重新选择。不是很优雅,但它应该可以工作。【参考方案3】:

我相信这篇文章可能对你有用:

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

ReadOnly 属性可以应用于整个网格、列、行或单个单元格。

【讨论】:

ReadOnly 不是“不可选择”。我编辑了我的问题以解释我的意思。

以上是关于DataGridView:如何使某些单元格无法选择?的主要内容,如果未能解决你的问题,请参考以下文章

DataGridView控件中如何获取选中单元格内容?

DataGridView里单元格背景色无法设置

Datagridview:如何在编辑模式下设置单元格?

检查指定的datagridview单元格的数值vb.net

DataGridView单元格编辑

赢表格。使用 BindingNavigator 时如何使 DataGridView 写入单元格值