2016-09-14 1 views
0

PanelAutoScroll = trueです。ピントを合わせるかどうかを確認する

その中でPanelは、一連のTextBoxです。 TextBoxpanelに直接は存在しませんが、複数のレベル(約4-5)がネストされています。

私のマウスホイールでのスクロールは、パネルにフォーカスが当たっている場合にのみ機能します。 mouseEnterイベント内でFocus()を使用して、パネルにフォーカスがあることを確認できます。

しかし、私が先に述べたTextBoxは重視しています。ユーザーは他の場所をクリックしてTextBoxからフォーカスを削除できるはずです。

TextBoxは動的に作成され、それらの配列を保持する非常に面倒なコードや、フォーカスがあるかどうかをチェックする任意のタイプの参照を作成します。言うまでもなく、それらの多くが存在する可能性があります。

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

を、その後でそれを使用します10

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

+0

問題は、テキストボックスはコントロールにはありませんが、いくつかのレイヤー(4-5)がネストされていることです。 Btw、 'x.Focused()'です.' anyTextBoxFocused = true;の後に 'break;'を追加します。 – Karlovsky120

+1

Focusedを見つけてくれたことに感謝し、休憩を追加しました。また、ネストされたテキストボックスをどのように取得できるかについてのヘルプも提供しました。 –

+0

私は参照を保持するきれいな方法を見つけることができました。しかし、あなたの答えは、もし私がしなければ、私がしたことでしょう。 – Karlovsky120

関連する問題