聚焦或不聚焦

时间:2016-09-14 03:02:20

标签: c# focus

我的PanelAutoScroll = true

其中Panel是一系列TextBox es。我应该注意TextBox es不是直接在panel,而是嵌套在几个级别(大约4-5)。

现在,只有当面板具有焦点时,我的鼠标滚轮才能自然滚动。我可以在Focus()事件中使用mouseEnter来确保面板具有焦点。

然而,我之前提到的TextBox es很大程度上依赖于焦点。只有用户才能通过点击其他地方从TextBox移除焦点。

TextBox es是动态创建的,并且会产生非常混乱的代码以保留它们的数组,或任何类型的引用来检查它们是否具有焦点。更不用说可能会有很多。

如何将焦点放在Panel上,但前提是TextBox es没有集中注意力?

1 个答案:

答案 0 :(得分:1)

您不需要保留动态创建的文本框数组,您可以使用以下命令获取数组:

bool anyTextBoxFocused = false;
foreach (Control x in this.Controls)
{
  if (x is TextBox && x.Focused)
  {
       anyTextBoxFocused = true;
       break;
  }
}
if (!anyTextBoxFocused)
{
    //give focus to your panel
}

修改

基于How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?,甚至可以使用以下方法获得嵌套控件:

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();

    return controls.SelectMany(ctrl => GetAll(ctrl,type))
                              .Concat(controls)
                              .Where(c => c.GetType() == type);
}

然后用它:

var c = GetAll(this,typeof(TextBox));