2009-09-01 16 views
2

コントロールの次の兄弟姉妹を見つける良い方法はありますか?C#:次と前の兄弟コントロールを見つける良い方法

たとえば、多数のボタンやテキストボックスなどがあるパネルがある場合などです。それらの中のどこかには、テキストボックスとボタンで構成されるユーザーコントロールがあります。ボタンをクリックすると、たとえば、このユーザーコントロールの後に来るコントロールの名前を探したいとします。

私の目標は、その前後に来るものとの位置を入れ替えることができるユーザーコントロールを作成することです(コースがあれば)。

私はあなたがControls.GetChildIndex(コントロール)を呼び出すことができますように見え、これは一種の些細でなければなりません知っているが、私はこの1つだけのまわりで私の頭を包むように見えることはできません... =/

+0

"次へ"と "前へ"をどのように定義しますか?タブの順序?それらがコンテナに追加される順序?ロケーションベース? –

+0

親のControlsコレクション内にある順序。視覚的には、この場合、フローパネルの前後に来るコントロールです。 – Svish

答えて

1

この解決策は、FlowLayoutPanelのケースにかなり固有です。

private enum Direction 
{ 
    Next, 
    Previous 
} 

private void SwapLocations(Control current, Direction direction) 
{ 
    if (current == null) 
    { 
     throw new ArgumentNullException("current"); 
    } 
    // get the parent 
    Control parent = current.Parent; 
    // forward or backward? 
    bool forward = direction == Direction.Next; 
    // get the next control in the given direction 
    Control next = parent.GetNextControl(current, forward); 
    if (next == null) 
    { 
     // we get here, at the "end" in the given direction; we want to 
     // go to the other "end" 
     next = current; 
     while (parent.GetNextControl(next, !forward) != null) 
     { 
      next = parent.GetNextControl(next, !forward); 
     } 
    } 
    // get the indices for the current and next controls 
    int nextIndex = parent.Controls.IndexOf(next); 
    int currentIndex = parent.Controls.IndexOf(current); 

    // swap the indices 
    parent.Controls.SetChildIndex(current, nextIndex); 
    parent.Controls.SetChildIndex(next, currentIndex); 
} 

使用例::それは彼らがコントロールコレクションに表示される順序でコントロールをレイアウトするので、トリックは場所を交換する必要があり、コントロールのインデックスを見つけるし、それらを切り替えることはもちろんである

私のために働いた
private void Button_Click(object sender, EventArgs e) 
{ 
    SwapLocations(sender as Control, Direction.Next); 
} 
1

現在のコントロールを使ってインデックスを取得し、次にControlsコレクションにインデックスを付けて前後の兄弟を取得します。

+0

例を挙げてください。好ましくは、それが最初または最後の制御であるか否かを考慮に入れているか? – Svish

0

子コントロールのタブ順で前後の次のコントロールを取得します。

編集:

コントロールのコレクションとそのメソッド。

+0

Doh ...どのように私はその1つを逃したのですか...しかし、Controlsコレクションのコントロールを並べ替えると、タブの順序は変わりませんか?それともそれに応じて変更されますか? – Svish

-2
this.Controls.SetChildIndex(panelContainerOfHeaderAndUserControl1, 0); 
this.Controls.SetChildIndex(panelContainerOfHeaderAndUserControl, 1); 

。 私は実行時に2つのパネルを作成しましたが、1つは塗りつぶしスタイルと他のトップパネルです。 塗りつぶしスタイルのパネルは、上のパネルで重ねて表示されます。

コントロールの兄弟順を設定すると、それが修正されます。

関連する問題