2016-06-28 25 views
0

私は10個の子パネルを含むメインパネルを持っています。私はカーソルが親パネルのスクロールバーにマウスのスクロールからスクロールできるようになることを常に望んでいました。パネルがフォーカスを失い、スクロールバーをスクロールできない

マウスを入力したときにParentPanel.Focus()を追加してこれを行いました。私のカーソルがテキストボックスである子パネルから離れると、この子パネルのテキストボックスは使用できなくなりました(私は入力できません)。このバグを回避するために、私はParentPanel.Focus()にコメントし、テキストボックスはうまくいきました。しかし、再び、私はスクロールできません。このための回避策はありますか?

+0

TextBoxのEnterイベントをコードします:textbox1.Focus(); ? – TaW

+0

と20 TextBoxのそれを行うのですか?あまりにもそれほどですか? –

+0

それがうまくいけば、動的に&再帰的に同じイベントにワイヤリングし、送信者をTextBoxにキャストすることができます。 - しかしscrllUp&Downメッセージをキャッチすることは別の方法です。 – TaW

答えて

1

​​は、Focusが本当にうまくありません。

この小さなヘルパー関数は、すべてのTextBoxesPageUpPageDownキーをキャッチし、それらを外側Panelをスクロールします:

void hookUpTextBoxesIn(Control ctl, ScrollableControl sCtl) 
{ 
    foreach(Control c in ctl.Controls) 
    { 
     if (c.Controls.Count > 0) hookUpTextBoxesIn(c, sCtl); 
     if (c is TextBox) 
     { 
      c.PreviewKeyDown += (s, e) => 
       { 
        if (e.KeyData == Keys.PageDown) sCtl.AutoScrollPosition = 
         new Point(sCtl.AutoScrollPosition.X, 
           -sCtl.AutoScrollPosition.Y + 10); 
        if (e.KeyData == Keys.PageUp) sCtl.AutoScrollPosition = 
         new Point(sCtl.AutoScrollPosition.X, 
           -sCtl.AutoScrollPosition.Y - 10); 
       }; 
     } 
    } 
} 

あなたはこのように一度セットアップでそれを呼び出します。

hookUpTextBoxesIn(ParentPanel, ParentPanel); 

MouseEnterには、次のように書くことができます。

if (!(ActiveControl is TextBox)) textBox1.Focus(); 

必要に応じてスクロール量を変更します。垂直スクロールのみをコード化してテストしました。他のキーまたは高度なキーコンビネーションのためにそれを展開することができます。

+0

親パネルのMouseEnter? –

+0

はい、そうです。しかし、これは本当にあなたのレイアウトの詳細に依存します:子パネルが親を満たすならば、それは決してできないでしょう。そして、すべての子パネルのMouseEnterを使う必要があります。彼らも同じイベントに夢中になることができます。 – TaW

関連する問題