2016-09-15 6 views
0

FlowLayoutPanel私は動的に50 UserControlを追加しています。パネルは垂直に配置され、各ユーザーコントロールには読み取り専用のラベルがいくつかあります。flowlayoutPanelで表示されるuserControlを見つけることは可能ですか

this.KeyPreview = true;をフォームに使用するので、イベントハンドラ​​を使用してkeyUpイベントをキャッチすることができます。このイベントハンドラで 、私は、ナビゲーションボタンに↑、↓PageUpキーPageDownキーをキャッチ。

私は、ナビゲーションボタンを以前UserControlをクリック

はパネルで選択され、クリック UserControlが選択されている場合。これはうまくいく。

顧客もPageUpキーPageDownキー私は前に述べたように、私は、イベントハンドラ​​でキャッチを使用できるようにしたいです。

どのようなUserControlが見えるのでしょうか。インデックス1,2,3,4のインデックス1,2,3,4のUserControlがパネルに表示されているとしたら、PageUpを使用し、インデックス4のユーザーコントロールをクリックすると、インデックス1のユーザーコントロールを選択できます。PageDownをクリックします。

助けを歓迎します。

+1

コントロールの少なくとも1つのピクセルが見える場合は、「可視」ですか? –

+0

各コントロールには、Boolean(get/set)Visibleプロパティがあります。コントロールをループしたり、Control.Visibleをテストしたりすることはできます。 –

+0

[ツアー]にぜひご参加ください。回答を受け入れて、あなたが有益であることを確認したQ&Aは、他のユーザーが良い答えを見つけるのに役立ちます。 – Plutonix

答えて

1

ヨ私が最初にそれらのTopによってコンテナのコントロールを命じ、上記のコードで

var controls = container.Controls.Cast<Control>().OrderBy(x => x.Top); 
var visibles = controls.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds)); 
var top = visibles.FirstOrDefault(); 
var bottom = visibles.LastOrDefault(); 

:Uは、このようなコードを使用することができます。その後、IntersectsWithを使用して、それらのコントロールの境界がコンテナのクライアント矩形と交差していることがわかりました。つまり、これらのコントロールが表示されています。

リストはコントロールのTopプロパティによって並べ替えられているため、最初のアイテムはコンテナの上部に表示され、最後のアイテムはコンテナの下部に表示されます。

  • 代わりCast<Control>のあなたはOfType<YourUserControl>を使用することができます。
  • 代わりのOrderBy(x => x.Top)あなたはAutoScroll=TrueFlowDirection=TopDownWrapContents=FalseFlowLayoutPanelを持っているなら、あなたの代わりにPanelを使用することができますあなたはcontainer.ScrollControlIntoView(top);を使用してビューにトップコントロールをもたらすことができるOrderByDescending(x => container.Controls.IndexOf(x))
  • または底部制御container.ScrollControlIntoView(bottom);
  • を使用することができ、ユーザーコントロールを追加するときだけ、Dock=Topを設定します。
+0

はい提案されたコードを使用しています。フォームの高さに応じてflowlayoutpanelで上下に移動するコードを追加する必要がありました。 – tony

+0

@tony私はあなたがフォームの高さを使用する必要はなく、その代わりにそのようなコードを使用することができると信じて 'container.ScrollControlIntoView(someControl); 'someControl'を表示させます。ここで 'container'はあなたの' FlowLayoutPanel'です。 –

+0

ところで、必要なフローが垂直で、 'FlowLayoutPanel'にスクロールバーがある場合は、代わりに' Panel'を簡単に使うことができ、ユーザコントロールを追加するとき 'Top' 。例[here](http://stackoverflow.com/a/32887572/3110834)を参照してください。 –

0

私が正しくあなたを理解すれば、これはあなたが意味見えることで、Visibleプロパティが「シャノンHolsinger」答え使用し、trueの場合は、

public List<Control> GetvisibleControls(Control parent) 
      { 
       List<Control> returnList = new List<Control>(); 
       foreach(Control child in parent.Controls) 
       { 
        if (child.Location.X < parent.Width && child.Location.Y < parent.Height) 
         returnList.Add(child); 
       } 
       return returnList; 
      } 
0

を意味したものです:あなたは少なくとも一つを意味する場合

をコントロールが表示されている場合の制御のピクセルはすべてのコントロールに、ループを見て、そして確認するため、この回答を使用することができる

C# winform check if control is physicaly visible

関連する問題