0

ascx ファイルで runat サーバーに設定した DIV のコントロールを見つけようとしていますが、デバッグすると、findcontrol の値が null になるため、それが見つかりません。何が間違っていますか?

これは私の ASPX ページから呼び出されます:

        HtmlGenericControl div = (HtmlGenericControl)FindControl("search");
        div.Visible = false;

私のASCXコード:

<div class="contactsearch" id="search" runat="server" visible='true'>
//mycontent
</div>
4

3 に答える 3

1

FindControl は最初の子のみを検索します。コントロール ツリーに再帰的に移動することはありません。次のようなものを使用します。

http://stevesmithblog.com/blog/recursive-findcontrol/

またはこれ

http://ra-ajax.org/jquery-ish-selector-for-webcontrols

于 2011-03-21T14:14:41.683 に答える
0

最初に contactsearch コントロールがコントロール ツリー階層にあることを確認します。これは、コントロールの Controls プロパティを調べるだけで実行できます。そこにある場合は、それを見つけるために再帰的なコントロール検索が必要です。

編集:アントニオに殴られた:P

于 2011-03-21T14:15:49.877 に答える
0

Markust と Antonio の回答で説明されているように、再帰アルゴリズムを使用して検索できますが、この場合は機能します。ただし、いくつかの問題があります。たとえば、ページに usercontrol のインスタンスが 2 つある場合は機能しません。

ただし、より大きな問題は、ユーザーコントロールが提供するカプセル化を壊していることです。含まれているページは、ユーザーコントロールに、たとえば「txtSearchCriteria」という名前のテキストボックスや「btnSearch」という名前のボタンが含まれていることを認識してはなりません。(または<div>名前付きの「検索」) 含まれているページは、ユーザー コントロールが公開しているインターフェイスを使用して、ユーザー コントロールでのみ動作する必要があります。

ユーザーコントロールにプロパティ (またはプロパティのセット) を作成して、消費者が期待どおりにコントロールを操作できるようにすることをお勧めします。例えば:

Public Boolean SearchControlsVisible
{
    get { return search.Visible; }
    set { search.Visible = value; }
}

<div>ページにユーザーコントロールのインスタンスが複数ある場合でも、プロパティのコードはあいまいさなしに「検索」にアクセスできます。この方法では、ページにコントロールを配置するときに ASPX マークアップでこれらのプロパティを設定することもできます。

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    ...etc... />

あなたの質問にはありませんが、ユーザーコントロールで発生するイベントにも応答する必要があります。ユーザー コントロールからイベントを発生させる手順については、次のページを参照してください: http://msdn.microsoft.com/en-us/library/wkzf914z(v=vs.71).aspx

イベントを作成して公開したら、次のようにマークアップにハンドラーをアタッチできます。

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    OnSearchClicked="SearchPanel_SearchClicked"
    ...etc... />
于 2011-03-21T14:48:59.557 に答える