2016-09-14 153 views
0

我有PanelAutoScroll = true聚焦还是不聚焦

因为Panel是一系列TextBox es。我应该注意,TextBox es不直接在panel上,但是嵌套了几个级别(约4-5)。

现在,使用我的鼠标滚轮进行滚动只能在面板自然对焦的情况下才起作用。我可以在mouseEnter事件中使用Focus()以确保面板具有焦点。

但是,我前面提到的TextBox严重依赖焦点。只有用户应该能够通过点击其他地方从TextBox中移除焦点。

这个TextBox es是动态创建的,它会让一个非常混乱的代码来保存它们的数组,或者任何类型的引用来检查它们是否有焦点。更不用说可能会有很多。

我如何将重点放在Panel上,但前提是TextBox没有一个关注点?

回答

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));

+0

问题在于文本框不在控件上,但嵌套了几层(4-5)。顺便说一句,它是'x.Focused()',我会在'anyTextBoxFocused = true;'之后加上'break;'。 – Karlovsky120

+1

更改,感谢您发现聚焦,增加了一个休息,并希望提供帮助,您甚至可以获得甚至嵌套的文本框。 –

+0

我设法找到保持参考的干净方式。但是,如果我不这样做,你的答案就是我会做的。 – Karlovsky120