扩展usercontrol,如果在ascx页面上声明,则内部控件未初始化

时间:2012-06-01 10:44:44

标签: c# asp.net web-user-controls

我正在创建的Usercontrol由3个文件组成(ascx,ascx.cs和ascx.designer.cs)

我的问题:

在aspx页面中创建的控件(asp:Button runat =“server”id =“mybutton”/>)未正确初始化,因此附加到“Load”事件并尝试使用按钮,结果在null对象异常中

我怀疑这是一个Visual Studio问题,无论是奇怪的bug还是异常的设置,但如果我做的事情愚蠢的话我也不会感到惊讶。

我尝试过的工作

  1. 我在Visual Studio中将另一个正在运行的用户控件从另一个项目复制到这个项目中,它也无效(ascx页面中定义的控件在代码页面后面的load事件中为null,尽管它们工作正常我从哪里复制了它们

  2. 我正在使用'CreateChildControls()'方法,就像我在其他一些复合控件中所做的那样,但是在load和init事件中一切都仍为null

  3. 我创建了一个单独的解决方案和项目文件,并添加了所有文件和参考文件,但是,这对情况没有帮助。

  4. 在我看来,“页面生命周期”(控制生命周期?)由于某种原因没有正确初始化控件,但是无法理解为什么,请有人帮忙。

    根据要求发布我的代码:

    PersonalDetails.aspx
        <cwpEditControl:PersonalDetails runat="server" id="edtPersonalDetails" />
    
    PersonalDetails.ascx
        <%@ Control Language="C#" CodeBehind="PersonalDetails.ascx.cs" Inherits="company.web.CustomerWebPortal.controls.edit.PersonalDetails" %>        
        <asp:Button runat="server" ID="myTestButton" />         
    
    PersonalDetails.ascx.cs
        public PersonalDetails()
        {         
            this.Load += new EventHandler(PersonalDetails_Load);
        }
    
        void PersonalDetails_Load(object sender, EventArgs e)
        {
            this.myTestButton.Text = "Submit";  //this line creates an exception!
        }
    
    PersonalDetails.ascx.designer.cs
        protected global::System.Web.UI.WebControls.Button myTestButton;
    

1 个答案:

答案 0 :(得分:2)

我已经通过添加到web.config文件修复了我的问题,基本上是在我正在创建的整个Web应用程序中“注册”我的自定义控件:

<pages>
  <controls>
    <add tagPrefix="scottgu" src="~/Controls/Header.ascx" tagName="header"/>
    <add tagPrefix="scottgu" src="~/Controls/Footer.ascx" tagName="footer"/>
    <add tagPrefix="ControlVendor" assembly="ControlVendorAssembly"/>
  </controls>
</pages>

解释web.config文件添加的链接(请注意本文不直接解决我的问题)

http://weblogs.asp.net/scottgu/archive/2006/11/26/tip-trick-how-to-register-user-controls-and-custom-controls-in-web-config.aspx

我个人觉得我的自定义控件的“网站范围”声明应该是必需的,但它解决了问题,所以我正在使用它,但仍然希望我明白为什么它需要是这样做了。