1

レイアウトの XML ファイルを生成するタスクがありますが、フォーム上の Panel コントロールの認識に問題があるようです。オブジェクトを認識するために、次のようなものを使用します。

foreach (Control c in this.Controls) {
    if (c is Button) {
        //generate XML...
    } else if (c is Panel) {
        //generate XML...
    }
}

すべてのコントロールは正常に検出されますが、Panel オブジェクトは検出されません。ここで何が間違っているのか誰にも教えてもらえますか? パネルはコントロールではありませんか?

4

4 に答える 4

1

この再帰関数を使用できます。

var panels = FindControls<Panel>(aForm).ToList();

IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
     }
}
于 2012-12-04T21:19:08.453 に答える
1

パネルコントロールですが、他のコントロール内にあるものではなく、フォームに直接あるコントロールのみを取得します。

では、次のようなものはどうでしょうか。

void DoRecursive(Control ctrl)
{
    foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);

    if (ctrl is Button) etc.
}

または//generate XML...、ボタンがforeach. おそらくそれはbreak.

于 2012-12-04T21:46:02.233 に答える
0

フォーム上に 1 つのボタンと 1 つのパネル、およびパネル内に 1 つのボタンを持つ単純なフォームでコードを試しました。最初のボタンとパネルを見つけるのはうまくいきました。おそらく問題は、親がパネルであるコントロールにアクセスしたいということですか?

于 2012-12-04T21:02:06.577 に答える
-1

コードが機能するはずです。実行しないようにコードを変更しelse ifて、パネルを見つけることができるかどうかを確認してください。

foreach (Control c in this.Controls) {
    if (c is Panel) {
        MessageBox.Show("Hey, I found the " + c.Name + " panel!");
    }
}

また、名前で検索して、それがどのタイプのコントロールであるかを確認することもできます。

foreach (Control c in this.Controls) {
    // Looks for a control called 'panel1' - put in your panel's name
    if (c.Name == "panel1") {
        MessageBox.Show("Hey, I found a " + c.GetType().ToString());
    }
}
于 2012-12-04T20:57:14.693 に答える