0

ページに asp-tags を使用しない html テーブルを定義しました*.aspx。次に、いくつかの asp コントロールをこのテーブルの行に追加しました: <asp:CheckBox>.

ユーザーに大量の選択を提供する必要があり、チェックボックスの数を最小限に抑えることができないため、多くのチェックボックスを定義しました。

で、CodeBehind検索するコントロール全体を列挙し、必要なものを列挙してGetType().Name、将来のアクションのために一時リストに追加したいと考えました。

しかし、デバッガーでチェックボックスが表示されず、コントロールの量が非常に少ないという問題があります。

次のようにページ内のコントロールを列挙しています。

foreach (var item in Page.Controls)
{
    if (item.GetType().Name == "CheckBox")
    {
         CheckBox checkBox = item as CheckBox;

         if (checkBox.ID != null && checkBox.ID != String.Empty && checkBox.Checked)
         {
             arrayDocs.Add(checkBox.ID);
         }
    }
}

私のページの完全なコード:

aspx: http://pastebin.com/gUs2LchL

コードビハインド: http://pastebin.com/5tfnKJSt

4

1 に答える 1

0

MSDNによると、Control.Controls プロパティは、子孫ではなく、そのコントロールのコントロールのコレクションを返します。そのコントロールに直接含まれるサーバー側のコントロールのみがコレクションの一部になります。

ページ上のすべてのコントロールのコレクションを構築したい場合は、コントロールを再帰的にループして、子コントロールなどを追加する必要があります-Magnus が正しく述べたように。

最も効率的/パフォーマンスの高い方法は、チェックボックスの親コンテナー (この場合は HtmlTable "tableDocs" のセル) からコレクションを構築することです。

変化する-

foreach (var item in Page.Controls)

に-

foreach (var item in tableDocs.Controls)

次に、チェックボックスに到達する前に、子コントロールを少なくとも 2 つのレベル (行 -> セル -> チェックボックス) まで再帰的にループする必要があります。

はるかに簡単なのは、ジェネリックを使用して、テストするすべてのチェックボックスを含む型付きの CheckBox のリストを作成することです。

何かのようなもの-

var checkboxes = new List<CheckBox>{checkboxAuctionHistory, checkboxBackSaldo, checkboxBalanceDecrypted}; //And so on

    foreach (var checkbox in checkboxes)
    {
        if (!string.IsNullOrWhiteSpace(checkbox.ID) && checkbox.Checked)
            {
                arrayDocs.Add(checkbox.ID);
            }
        }
    } 

これには明らかな欠陥があり、フォームに新しいチェックボックスを追加するたびにリストを変更することを覚えておく必要があります。

または、テーブルからチェックボックスを移動するか、runat="server" 属性をテーブルから削除して、ASP.NET コントロール ツリーからテーブルを削除し、チェックボックスのコンテナーを "form1" にします。

ページ上の他のほとんどのマークアップには runat="server" がないため、これらの要素は ASP.NET コントロール ツリーの一部ではありません。

于 2013-05-12T19:40:44.363 に答える