2016-09-14 156 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