3

2つのユーザーコントロールが登録されたASP.NETページがあります。最初のボタンにはボタンが1つだけあります。2つ目は単純なテキストで、デフォルトでは非表示になっています。私が欲しいのは、最初のボタンがクリックされたとき(つまり、ボタンクリックイベント)に2番目のボタンが表示されるようにすることです。

ASP.NETページ:

<%@ Page Title="" Language="C#" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Register Src="~/UC_button.ascx" TagName="button" TagPrefix="UC" %>
<%@ Register Src="~/UC_text.ascx" TagName="text" TagPrefix="UC" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MyTestContent" Runat="Server">
    <UC:button ID="showbutton1" runat="server" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MyTestContent2" Runat="Server">
    <UC:text runat="server" Visible="false" ID="text1" />
</asp:Content>

UC_Button.ascx.cs:

protected void button1_Click(object sender, EventArgs e)
{
    Button btnSender = (Button)sender;
    Page parentPage = btnSender.Page;
    UserControl UC_text = (UserControl)parentPage.FindControl("text1");
    UC_text.Visible = true;
}

私は何が間違っているのですか?Object reference not set to an instance of an object.コードの最後の行でよく知られているエラーが発生します。

編集:

これを最初に投稿したときに私が言及するのを忘れた1つのこと。ユーザーコントロールは別の<asp:Content></asp:Content>コントロールにあります(上の例を編集しました)。それらを同じプレースホルダーコードに入れると、問題なく機能します。それらを別々のコンテンツプレースホルダーに配置すると、findcontrolではそれらを見つけることができません。それはなぜですか、どうすればそれらを見つけることができますか?

4

4 に答える 4

6

以下を確認してください:

UserControl UC_text = (UserControl)this.NamingContainer.FindControl("text1");
于 2011-07-26T10:04:24.720 に答える
2

FindControlメソッドは、コントロールの詳細検索を行いません。要求しているコントロールに指定した場所を直接検索します。

あなたの場合、あなたがする必要があるのは次のようなものです:

UserControl UC_text = (UserControl)Content1.FindControl("text1");

ここで私の質問も見ることができます:タイプごとにディープコントロールを見つける方法を示すyieldreturnを使用したIEnumerableとRecursion 。

于 2011-07-26T09:47:36.470 に答える
2

わかりました、より良い解決策が見つかるまで解決策を見つけました。問題は、Jamie Dixon が指摘したように (Jamie に感謝します):

The FindControl method does not do a deep search for controls. It looks directly in the location you specify for the control you're requesting.

したがって、さまざまな contentplaceholder にユーザー コントロールがあるため、最初に対象のプレースホルダー (ユーザー コントロールが存在する場所) を見つけてから、その中のユーザー コントロールを検索する必要があります。

protected void Dodaj_Feed_Panel_Click(object sender, EventArgs e)
    {
        ContentPlaceHolder MySecondContent = (ContentPlaceHolder)this.Parent.Parent.FindControl("MyTestContent2");

        UserControl UC_text = (UserControl)MySecondContent.FindControl("text1");
        UC_text.Visible = true;
    }

私を本当に悩ませ、混乱させているのは、this.Parent.Parentそれが最善の解決策ではないことを知っているためです(階層を少し変更すると、このコードが壊れます)。コードのこの部分が実際に行うことは、ページ階層 (つまり、両方のユーザー コントロールがあるページ) で 2 レベル上に移動することです。this.Page私にとっては同じ意味ですが、私にとっては機能しないため、違いが何であるかわかりません。

長期的な解決策は、サーバー側の「jQuery のようなセレクター」のようなものです (要素が階層のどこにあるかに関係なく、要素を見つけることができます)。誰もがより良い解決策を持っていますか?

于 2011-07-27T12:23:06.257 に答える