3

LabelがGroupBoxにある場合、ラベルコントロールはforeachループでヒットしません。ラベルがGroupBoxの外にある場合、それらはあります。それらを見つけるためにループを取得するにはどうすればよいですか?

     foreach (Control c in this.Controls)
     {
         if (c is Label)
         {
             if (c.Text == "12/31/1600")
             {
                 c.Text = "Not Found";
             }
         }
     }
4

3 に答える 3

4
SetLabels (this);

public void SetLabels(Control ctrl)
{
  foreach (Control c in ctrl.Controls)
     {
         SetLabels(c);
         if (c is Label)
         {
             if (c.Text == "12/31/1600")
             {
                 c.Text = "Not Found";
             }
         }
     }
}
于 2012-09-27T02:41:49.000 に答える
2

使用する

this.groupBox1.Controls

 foreach (Control c in this.groupBox1.Controls)
 {
     if (c is Label)
     {
         if (c.Text == "12/31/1600")
         {
             c.Text = "Not Found";
         }
     }
 }
于 2012-09-27T02:42:42.570 に答える
1

再帰を使用できます。まず最初に、コントロールをパラメーターとして受け入れるデリゲートを定義します。

public delegate void DoSomethingWithControl(Control c);

次に、このデリゲートを最初のパラメーターとして受け取るメソッドと、それを再帰的に実行するためのコントロールを2番目のパラメーターとして実装します。このメソッドは、最初にデリゲートを実行し、次にコントロールのControlsコレクションをループして、それ自体を再帰的に呼び出します。これは、コントロールがコントロールで定義されており、ラベルなどの単純なコントロールに対して空のコレクションを返すため、機能します。

public void RecursivelyDoOnControls(DoSomethingWithControl aDel, Control aCtrl)
{
    aDel(aCtrl);
    foreach (Control c in aCtrl.Controls)
    {
        RecursivelyDoOnControls(aDel, c);
    }
}

これで、ラベルの値を変更するためのコードをメソッドに配置し、デリゲートを介してフォームで呼び出すことができます。

    private void SetLabel(Control c)
    {
        if (c is Label)
        {
            if (c.Text == "12/31/1600")
            {
                c.Text = "Not Found";
            }
        }
    }

RecursivelyDoOnControls(new DoSomethingWithControl(SetLabel), this);
于 2012-09-27T08:44:52.083 に答える