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

3
如何在C#中禁用DataGridView的单元格Tab停止?如果用户聚焦于DataGridView并按下“Tab”键,则希望下一个控件获得焦点,而不是聚焦于DataGridView的下一个单元格。您该如何做到这一点?

1
请允许我备注一下,Ctrl + Tab 可以移动到下一个控件。 - Bgl86
4个回答

8

DataGridView.StandardTab属性设置为true

以下是该属性的描述:

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

在VS2012 .NET 4中,将新的datagridview添加到窗体后,默认情况下为false(文档中没有看到默认状态)。

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

我建议在搜索问题解决方案时,将对象和所需功能键入Google,然后加上空格,然后输入“msdn”文本。这解决了我的40%的困境。如果这行不通,请将msdn替换为stackoverflow。这解决了另外50%的问题。最后10%是休息一下,再回来解决。


这为什么不是正确的、标记的答案呢?虽然标记的答案是正确的并且实现了所要求的功能,但是StandardTab才是正确的答案,也是正确的做法。 - bunggo

0

这是我是如何做到的。 由于它有点棘手,我尝试了很多次才找到正确的代码。 创建一个继承自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);
    }
}

0

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
    }
}

-1

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

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;

将 KeyUp 事件更改为 KeyDown 事件对我很有效。否则,用户无法通过按“Tab”键来聚焦于 DataGridView。你能修改为 KeyDown 事件吗? 此外,它不会移动焦点到下一个单元格,所以我不需要添加“撤销”代码。 非常感谢! - Mystic Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接