如何在ASP.NET页面的另一个用户控件事件中找到该ASP.NET页面中的用户控件?编辑:不同的内容占位符?

3

我有一个注册了两个用户控件的ASP.NET页面。第一个控件只有一个按钮。第二个控件是简单的文本,初始情况下被隐藏。我的目标是在第一个控件中的按钮被点击时(即在按钮点击事件中),使第二个控件可见。

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;
}

我做错了什么?在代码的最后一行,我遇到了众所周知的错误"对象引用未设置为对象实例"

编辑:

我在最初发布时忘记提及一个问题。用户控件位于不同的<asp:Content></asp:Content>中(我已编辑上面的示例)。如果我将它们放在同一个占位符中,代码就可以正常工作。如果我将它们放在单独的内容占位符中,我无法使用findcontrol找到它们。为什么会这样,我该如何找到它们?

4个回答

6

请查看以下内容:

UserControl UC_text = (UserControl)this.NamingContainer.FindControl("text1");

2

FindControl方法不会深度搜索控件。它直接查找您指定的位置以获取所请求的控件。

在您的情况下,您需要执行以下操作:

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

您也可以在这里查看我的问题:IEnumerable和使用yield return的递归,该方法演示了通过类型查找深层控件的方法。


йЎөйқўзҡ„Content1д»ҺиҜҘйЎөйқўеҶ…йғЁз”ЁжҲ·жҺ§д»¶дёӯдёҚеҸҜи§Ғ/ж— жі•и®ҝй—®пјҲжҲ–иҖ…жҲ‘е®Ңе…Ёй”ҷдәҶпјҹпјү - Janez
我认为你是正确的。看着你的代码,你应该能够直接引用text1,而不必使用FindControl。 - Jamie Dixon
我在不同的内容占位符中有用户控件,所以无法直接引用它(会产生相同的错误)。请参见上面我更新的问题/问题。 - Janez

2

我找到了一种解决方法,直到更好的方法出现。问题是,正如Jamie Dixon指出的那样(谢谢Jamie):

FindControl方法不会深入搜索控件。它直接在您指定的位置查找请求的控件。

因此,由于我在不同的内容占位符中有用户控件,我必须先找到目标占位符(其中用户控件驻留),然后我才能在其中搜索用户控件:

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 部分,因为我知道这不是最好的解决方案(如果我稍微改变了层次结构,这个代码就会失效)。这段代码实际上是在页面层次结构中向上移动两个级别(即包含两个用户控件的页面)。我不知道与 this.Page 的区别是什么,因为对我来说意思相同,但它对我不起作用。
长期解决方案将是类似于服务器端的“jQuery选择器”(可以找到层次结构中的任何元素)。有没有更好的解决方案?

2
更好的解决方案:MVC :) - drzaus

0

使用用户控件的ID,然后将控件(例如文本框)放置在面板内,然后从主页面尝试此代码

示例:

TextBox txt = (TextBox)showbutton1.FindControl("Textbox1");

用UpdatePanel更新: TextBox txt = (TextBox)showbutton1.FindControl("Textbox1"); txt.Text="你好,世界!";

((UpdatePanel)showbutton1.FindControl("UpdatePanel1")).Update();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接