【问题标题】:How can I stop cells from being entered when a datagridview row is selected by a row header click?当通过行标题单击选择 datagridview 行时,如何停止输入单元格?
【发布时间】:2011-05-31 01:35:10
【问题描述】:

每当用户单击行标题时,会选择整行(并将其突出显示为蓝色),实际输入的是第一列中的单元格。也就是说,如果您开始输入内容,则文本会进入该单元格。我想防止这种情况。选择一行或多行时是否可以不输入datagridview单元格?

我还需要一种解决方案,以防止在通过单击和拖动行标题导致的多行选择期间输入单元格。

关于如何实现这一目标的任何想法?

谢谢

艾萨克

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    将 DataGridView 的 ReadOnly 属性设置为 true 或 false,具体取决于是否选择了一行或多行,或者 DGV 的“CellState”是否已更改。

    为您的 DataGridView 添加以下两个事件:

    private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) {
        if (e.StateChanged == DataGridViewElementStates.Selected) {
            Console.WriteLine("TRUE");
            dataGridView1.ReadOnly = true;
        }
    }
    
    private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) {
        if (e.StateChanged == DataGridViewElementStates.Selected) {
            Console.WriteLine("false");
            dataGridView1.ReadOnly = false;
        }
    }
    

    这在我的测试中对我有用,但如果有隐藏的“陷阱”,我不会感到惊讶。

    【讨论】:

    • @Jay Riggs-在单击和拖动过程中选择行时,rowheadermouseclick 事件是否也会触发?
    • @IsaacB - 我相信只要单击行标题就可以了。大约 10 小时可以测试。
    • 没关系,稍后我会测试它。我只是担心在鼠标悬停期间选择的行(按下按钮在选择多行) span>时
    • 对不起,我应该在之前的评论中更具体。
    • 当网格设置为全行选择时不起作用。到目前为止,这是我发现的一个问题。
    【解决方案2】:

    另一种解决方案可能是这样的:

        private void dataGrid_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && dataGrid.Rows[e.RowIndex].Selected)
                return;
        }
    

    【讨论】:

    • 这只会停止执行CellEnter 事件。它不会自动停止单元格编辑。我找不到任何有用的方法从这个事件中离开牢房。例如,取消编辑或更改当前单元格的尝试不会产生预期的效果。
    【解决方案3】:

    根据“Jay R”的回答,我稍微调整了代码,以免丢失单元格的只读标志。

    private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
    {
        if (e.StateChanged == DataGridViewElementStates.Selected)
            e.Row.DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;
    }
    
    private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
    {
        if (e.StateChanged == DataGridViewElementStates.Selected)
            // adjust the edit mode to your "default" edit mode if you have to
            e.Cell.DataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多