2

を使用してコントロールをロードするのが得意なLoadControl("~/vitrualPath")ので、次のようになります。

UserControl ctrl = (UserControl)LoadControl("~/controls/someControl.ascx");
this.Controls.Add(ctrl);
//plcCtrl.Controls.Add(ctrl);

問題は、usercontrolのすべてのコントロールをループしたいということです。

foreach (Label c in this.Controls.OfType<Label>())
{
  // It's a label for an input
  if (c.ID.Substring(0, 8) == "lblInput")
   {
     // Do some stuff with the control here
   }
}

ただし、追加されたコントロールはの一部ではthisなく、の一部ですctrl

ロードされたコントロールのコンテンツを追加する方法、または両方を1回のヒットでthisループする方法はありますか?thisctrl

4

5 に答える 5

2

トップレベルのラベルとのラベルの両方をループしたいだけの場合は、ループをctrl試しthis.Controls.Concat(ctrl.Controls).OfType<Label>()てくださいforeach

ifLINQWhere呼び出しに移動することもできます。

.Where(l => l.ID.Substring(0, 8) == "lblInput")

于 2012-06-07T10:56:25.777 に答える
1

再帰関数を使用することで、サブレベル/コンテナー内のコントロールについて心配する必要がなくなります。このようなものは問題ないはずです(あなたがする必要があるのは、あなたが興味を持っているidサブストリングと一緒にトップレベルのコントロールを渡すことです)。したがって、条件が満たされている場合は、コントロールおよび任意のサブレベルで意図したことをすべて実行します。

public void ProcessControl(Control control, string ctrlName)
{
    foreach (Label c in control.Controls.OfType<Label>())
   {
       // It's a label for an input
       if (c.ID.Substring(0, 8) == ctrlName)
       {
            // Do some stuff with the control here
       }
    }

    foreach (Control ctrl in control.Controls)
    {
        ProcessControl(ctrl, ctrlName);        
    }    
}
于 2012-06-07T11:30:01.403 に答える
0

this.Controlsでコントロールのループを開始し、コントロールのツリーを下る再帰メソッドを作成する必要があります。次に、ユーザーコントロールに移動して、ラベルを検索します。

于 2012-06-07T10:55:48.507 に答える
0

私はあなたが望むように両方をループする方法はないと思います。

コントロールをパラメーターとして受け取り、そのコントロールを反復処理するメソッドを簡単に作成できます。このようなもの:

void Function(Control control)
{
    foreach (Label c in control.Controls.OfType<Label>())
    {
       // It's a label for an input
       if (c.ID.Substring(0, 8) == "lblInput")
       {
         // Do some stuff with the control here
       }
    }
}
于 2012-06-07T10:56:08.890 に答える
0

this.Controls[index].Controls私が思うにアクセスすることで、ユーザーコントロール内のコントロールにアクセスできるはずですが、それはあなたが何を達成しようとしているのかによって異なりますか?彼らはあなたがやろうとしていることをするためのよりクリーンな方法かもしれませんか?

于 2012-06-07T10:56:49.380 に答える