3

5 つのユーザー コントロールを持つページがあります。もっとやりたいのですが、とりあえず以下の方法で数えたいと思います。

void btnFormSave_Click(object sender, EventArgs e)
{
  int i = 0;
  ControlCollection collection = Page.Controls;
  foreach (Control ctr in collection)
  {
    if (ctr is UserControl)
    {
      i++;
    }
   }
}

このコードをデバッグすると、i = 1 で、コントロールはマスター ページです (マスター ページがユーザー コントロールであることを知りませんでした)。

ページにあるユーザー コントロールをカウントするにはどうすればよいですか?

編集

これは私のコンテンツ プレースホルダー マークアップです。

<asp:Content ID="cntMain" runat="Server" ContentPlaceHolderID="ContentMain">
4

2 に答える 2

1

編集:元のオフベースの回答を次のように置き換えます。

おそらく、コントロール内のコントロールに再帰する必要があります (おそらくパネルに?)。

http://msdn.microsoft.com/en-us/library/yt340bh4(v=vs.100).aspx

この例では、Page オブジェクトに含まれるコントロールと、ページの直接の子であるコントロールのみを検索します。ページの子であるコントロールの子であるテキスト ボックスは検出されません。たとえば、Panel コントロールをページに追加した場合、Panel コントロールは Page に含まれる HtmlForm コントロールの子になり、この例で見つかります。ただし、TextBox コントロールを Panel コントロールに追加した場合、TextBox コントロールのテキストは、ページの子でも、ページの子であるコントロールの子でもないため、この例では表示されません。この方法でコントロールをウォークするより実用的なアプリケーションは、遭遇した各コントロールの Controls コレクションをウォークするために呼び出すことができる再帰メソッドを作成することです。

編集 2: SO の再帰的制御検索の例へのリンクを追加します。

LINQ を使用した例: https://stackoverflow.com/a/253962/704808

従来の例: https://stackoverflow.com/a/4955836/704808

于 2013-01-31T20:28:55.080 に答える
1

探す場所を変更するだけです。

void btnFormSave_Click(object sender, EventArgs e)
{
  int i = 0;
  // here, look inside the form, and not on page.
  ControlCollection collection = Page.Form.Controls;
  foreach (Control ctr in collection)
  {
    if (ctr is UserControl)
    {
      i++;
    }
   }
}

私は私のためにテストし、働いています。

于 2013-01-31T20:42:41.623 に答える