防止在窗体内的某些控件上进行选项卡式切换

本文关键字:选项 行选 控件 窗体 | 更新日期: 2023-09-27 18:27:50

我有一个包含多个UserControls的表单。

当按下用户控件内的按钮时,它将打开并添加另一个包含文本框和2个按钮。

一旦打开此用户控件,焦点/光标就会转到文本框。

按下TAB按钮可以将焦点从一个控件转移到另一个控件,从而在整个窗体中移动

所以基本上我想避免这种情况。

即存在一个名为XXX的UserControl对象。现在,当我单击其中的"打开编辑"按钮时,它会在XXX中打开一个名为YYY的新UserControl对象。

UserControlYYY有一个文本框和2个(保存和取消)按钮。

我想确保选项卡始终保持焦点在YYY中,直到单击"取消"按钮关闭YYY

我不确定是否存在窗体范围的TabStop属性?或者我应该循环浏览其他控件吗并将其TabStop设置为FALSE?

考虑到在不同的类下还有许多其他UserControls,这有点乏味。

有没有更简单的方法来实现这一点?

防止在窗体内的某些控件上进行选项卡式切换

实际上你的问题是:

如何在用户控件中保留制表位

您可以覆盖用户控件中要使选项卡停止的ProcessTabKey

protected override bool ProcessTabKey(bool forward)
{
    return this.SelectNextControl(this.ActiveControl, true, true, true, true);
}

这样,制表位将保留在用户控件中。

您需要将每个控件的TabStop属性设置为False

你可以这样做:

  1. 通过设计器
  2. 带有特定控件的代码(可能在Form_Load事件处理程序中)
  3. 对于大多数所有控件都有递归函数

天真递归函数:
我是用VB写的,所以你需要翻译

Public Sub LoopControls()   '  Assumes this function lives within the scope of a Form
    LoopControls(Me)
End Sub  
Public Sub LoopControls(ByVal container As Control)
    '
    '  TODO:  Do something with the current control (container)
    '
    '
    '  Loop over the current control's inner controls
    '
    If Not Nothing Is container.Controls
        For Each control As Control In container.Controls
            LoopControls(control)
        Next
    End If
End Sub