1

Windows フォームにパネルがあり、テキスト ボックスなどの他のコントロールを追加し、パネル内のすべての要素を反復処理して、その中のすべてのデータを取得します。

これはパネルコントロールで行うことができますか?

次のようなforeachループを試しました

foreach(textbox tb in panel1)
{
}

しかし、パネルに GetEnumerator のパブリック定義がないというエラーが表示されます。

使用するより良いコントロール/コンテナーは何ですか?さらにコントロールを追加して、最終的にそのデータ内のすべてのコントロールにアクセスできますか?


更新 ちょっと注意してください-コードに複数のテキストボックスを追加する際に問題が発生しています。テキストボックス オブジェクトを作成してパネルに追加しましたが、表示されるのは 1 つだけです。このサイトや他のサイトの他の場所で、同じ名前のテキストボックスを追加すると問題が発生する可能性があることを読みました.

これを解決するために、パネルをフロー レイアウト パネルに置き換えました。うまくいけば、これは他の人に役立ちます。

4

5 に答える 5

3

使用する正しいコントロールです。パネル オブジェクトの Controls プロパティを反復してみてください。

foreach(Control control in panel.Controls)
{
    if(control is TextBox)
    {
         TextBox textBox = control as TextBox;
         //etc.
    }
}
于 2013-09-10T20:28:01.350 に答える
2

Panel の Controls コレクションにアクセスする必要があります。

foreach(Textbox tb in panel1.Controls.OfType<TextBox>)

ただし、上記では、パネル内の他のコントロール内ではなく、パネル内に TextBoxes を提供します。テキストボックスを再帰的に取得したい場合は、この質問を参照してください

于 2013-09-10T20:29:53.177 に答える
2

次の例では、任意のコントロールのすべてのテキスト ボックスをクリアします。

void ClearTextBoxes(Control parent)
{
    foreach (Control child in parent.Controls)
    {
        TextBox textBox = child as TextBox;
        if (textBox == null)
            ClearTextBoxes(child);
        else
            textBox.Text = string.Empty;
    }
}

その後、クリアしたいときはいつでも。あなたが呼ぶ

ClearTextBoxes(panel1);
于 2013-09-10T20:30:12.370 に答える
1

このようなもの

foreach (Control c in panel1.Controls)
{
  if(c.GetType() == typeof(TextBox))
  {
     //do stuff
  }
}
于 2013-09-10T20:28:38.510 に答える
1

ちょっとしたことがありません。試す:

foreach (Control c in panel1.Controls)

次に、複数のタイプのコントロールがある場合は、コントロールのタイプを確認します。

エラーの理由は、panel1 がオブジェクトのコレクションではなくオブジェクトであるため、具体的には panel1 に含まれるオブジェクトのコレクションを参照する必要があるためです。

于 2013-09-10T20:31:19.347 に答える