【问题标题】:Cannot find server control找不到服务器控制
【发布时间】:2012-09-30 06:30:09
【问题描述】:

我是 ASP.NET 的新手,但一直给我带来麻烦的是查找嵌套的服务器控件,尤其是嵌套的服务器控件。

在这种情况下,这是我的注册页面,直到我想要的服务器控件:

<asp:CreateUserWizard runat="server" ID="RegisterUser" ViewStateMode="Disabled" OnCreatedUser="RegisterUser_CreatedUser">
    <LayoutTemplate>
        <asp:PlaceHolder runat="server" ID="wizardStepPlaceholder" />
        <asp:PlaceHolder runat="server" ID="navigationPlaceholder" />
    </LayoutTemplate>
    <WizardSteps>
        <asp:CreateUserWizardStep runat="server" ID="RegisterUserWizardStep">
            <ContentTemplate>
                <fieldset>
                    <ol>
                        <li>
                            <asp:TextBox runat="server" ID="firstName" />
                        </li>

为了便于阅读,我只删除了一些 HTML 元素。我正在尝试访问'firstName'。我已经尝试了以下所有方法,但没有成功,(TextBox first 总是为空)。

TextBox first = (TextBox)Page.Master.FindControl("MainContent").FindControl("firstName");
TextBox first = (TextBox)Page.FindControl("firstName");
TextBox first = (TextBox)RegisterUserWizardStep.FindControl("firstName");
TextBox first = (TextBox)RegisterUser.FindControl("firstName");

不胜感激,谢谢!

【问题讨论】:

  • 我忘了添加我使用母版页的内容,以上所有内容都在占位符中。

标签: c# asp.net visual-studio


【解决方案1】:

通常您可能需要进行递归控制搜索。首先,将此方法添加到您的页面:

private Control FindControlRecursive(Control Root, string Id)
{
    if (Root.ID == Id)
        return Root;
    foreach (Control Ctl in Root.Controls)
    {
        Control FoundCtl = FindControlRecursive(Ctl, Id);
        if (FoundCtl != null)
            return FoundCtl;
    }
    return null;
}

现在,要找到控件,调用:

TextBox firstName = (TextBox)FindControlRecursive(this, "firstName");

【讨论】:

  • 类似答案stackoverflow.com/questions/6572255/…。尝试提供链接而不是发布它..
  • 既然我可以给出答案,为什么还要给出链接?
  • 因为这样可以使信息保持集中。 Stackoverflow 的全部要点.. Nyways.. 这是我一直在寻找的答案.. 谢谢 Mate
  • 谢谢,有没有什么地方可以添加这个功能,这样我就可以在我网站的任何地方使用它,而不是在一个页面上使用它?
  • 你有一个所有页面都继承自的 BasePage 吗?您可以将其从私有方法更改为公共方法并将其放在基本页面中。否则,您可以将其更改为从单独的类 (Class1.FindControlRecursive(...)) 调用的公共静态方法。如果这是一个网站,则该类应位于 AppCode 文件夹中。如果它是一个 WebApp,它可以放在您的 Web 项目中的任何位置。
【解决方案2】:

试试这段代码:

TextBox first = (TextBox) RegisterUser.CreateUserStep.ContentTemplateContainer.FindControl("firstName");

【讨论】:

  • 成功!谢谢!你介意解释一下你是怎么做到的吗?这是我的网页中反复出现的问题。
  • 有不同的方法可以找到嵌套控件。对于 CreateUserWizard,这是访问方式,msdn.microsoft.com/en-us/library/ms178342%28v=vs.100%29.aspx
  • 如果它真的对您有所帮助,那么接受此答案的 UpVote 将非常令人鼓舞。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多