如何在c#中禁用DataGridView的每个单元格选项卡停止

本文关键字:单元格 选项 DataGridView | 更新日期: 2023-09-27 18:11:52

如何在c#中禁用DataGridView的每个单元格选项卡停止?

如果用户专注于DataGridView并按下'Tab',我希望下一个控件将被聚焦,而不是专注于DataGridView的下一个单元格。

我该怎么做呢?

如何在c#中禁用DataGridView的每个单元格选项卡停止

设置DataGridView.StandardTab属性为true

下面是属性的描述:

"指示TAB键是否按选项卡顺序将焦点移动到下一个控件,而不是将焦点移动到控件中的下一个单元格。"

在VS2012 . net 4中,添加新的datagridview到表单后,默认为false(没有在文档中看到默认状态)。

https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.standardtab (v = vs.110) . aspx

我建议在搜索问题的解决方案时,在google中键入对象和所需的功能,然后键入空格,然后键入文本msdn。这解决了我40%的困境。如果这不起作用,用stackoverflow代替msdn。这又解决了50%的问题。最后的10%是休息一下再回来的结果。

制作AllowUserToAddRows = false,然后

private void ToNextControl(bool Forward)
{
    Control c = Parent.GetNextControl(this, Forward);         
    while (c != null && !c.TabStop) // get next control that is a tabstop
        c = Parent.GetNextControl(c, Forward);
    if (c != null)
    {
        //c.Select(); // Not needed for it to work
        c.Focus(); // force it to focus
    }
}

我是这样做的。为了得到正确的代码,我进行了大量的尝试和错误,因为这有点棘手。创建一个继承DataGridView的类来创建一个自定义的DataGridView编译项目,MyDataGridView将出现在工具箱中。它的新功能是绕过只读单元格,你可以使用ENTER或TAB在单元格之间导航

public class MyDataGridView : DataGridView
{
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        if (keyData == Keys.Tab || keyData == Keys.Enter)
        {
            int index = this.CurrentCell.ColumnIndex;
            if (index < this.ColumnCount - 1)
            {
                if (this.CurrentRow.Cells[index + 1].ReadOnly)
                    SendKeys.Send("{TAB}");
            }
                return this.ProcessTabKey(keyData);
        }else if(keyData == (Keys.Enter | Keys.Shift) || keyData == (Keys.Tab | Keys.Shift))
        {
            int index = this.CurrentCell.ColumnIndex;
            if (index > 0)
            {
                if (this.CurrentRow.Cells[index - 1].ReadOnly)
                    SendKeys.Send("+{TAB}");
            }
            return this.ProcessLeftKey(keyData);
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

这将使下一个控件获得焦点:

private void DataGridView1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Tab)
   {
       DataGridView1.Enabled = false;
       DataGridView1.GetNextControl(DataGridView1, true).Focus();
       DataGridView1.Enabled = true;
       e.Handled = true;
   }
}

当使用KeyUp时,datagridview仍然在放弃焦点之前进一步移动一个单元格。如果你想撤销它,你可以添加这行代码:

DataGridView1.CurrentCell = DataGridView1.Rows[DataGridView1.CurrentCell.RowIndex].Cells[DataGridView1.CurrentCell.ColumnIndex - 1];
DataGridView1.Enabled = false;
DataGridView.GetNextControl(DataGridView1, true).Focus();
DataGridView1.Enabled = true;