NullReferenceException当用户控件引用父用户控件中的usercontrol时

时间:2010-05-25 16:56:13

标签: asp.net

我有一个继承自uc2的用户控件(uc1)。 uc2在标记中声明了用户控件(uc3)。我试图从uc1访问uc3但我得到NullReferenceException。我认为由于继承uc3会实例化,但看起来我错过了一步。

澄清:

子用户控件如何从基类继承标记?基本用户控件中的服务器控件在基本用户控件的后面代码中为空。为什么呢?

4 个答案:

答案 0 :(得分:0)

使用FindControl方法查看并遍历页面结构。 Rick Strahl的文章:ASP.NET 2.0 MasterPages and FindControl()经历了这一点。这可能是一项昂贵的操作,特别是如果你需要在树上走来走去。

.Net 1.1和2.0之间也存在一个关键的区别,其中1.1后面的代码继承自aspx页面,你在两者中都声明了你的控制变量,但是2.0使用了组合形成单个类的部分类,只需要一个单一声明,见; http://msdn.microsoft.com/en-us/library/ms227671.aspx

答案 1 :(得分:0)

你试过uc1.uc3 = new uc3你在哪里创建uc1的实例?这应该可以解决问题。

答案 2 :(得分:0)

公共类Uc2:UserControl
{         私人Uc3 _uc3;         公共Uc3 Uc3         {             得到{return _uc3; }         } }

public class Uc3:UserControl { }     公共类Uc1:Uc2     {         public Uc1()         {             Uc3 uc3 = this.Uc3;             //要么             Uc3 uc3_interface =((IUc3)Page).Uc3;         }     }     公共接口IUc3     {         Uc3 Uc3 {get; }     }     公共类PageContainer:Page,IUc3     {         私人Uc2 _uc2; //必须分配或必须存在于标记设计器

    public Uc3 Uc3
    {
        get { return _uc2.Uc3; }
    }
}

答案 3 :(得分:0)

查找控件可以完成这项工作,但这不是一个好习惯。如果您更改了标记中的控件ID,编译器将无法捕获它,请不惜任何代价 使用系统; 使用System.Data; 使用System.Configuration; 使用System.Web; 使用System.Web.Security; 使用System.Web.UI; 使用System.Web.UI.WebControls; 使用System.Web.UI.WebControls.WebParts; 使用System.Web.UI.HtmlControls;

命名空间WebApplication5 {

public class Uc2: UserControl  
{
    private Uc3 _uc3;

    public Uc3 Uc3
    {
        get { return _uc3; }
    }
}
public class Uc3 : UserControl
{
}
public class Uc1 : Uc2
{
    public Uc1()
    {
        Uc3 uc3 = this.Uc3;
        //or
        Uc3 uc3_interface = ((IUc3)Page).Uc3;
    }
}
public interface IUc3
{
    Uc3 Uc3 { get; }
}
public class PageContainer : Page, IUc3
{
    private Uc2 _uc2; //must be assigned or must exist in markup thus designer

    public Uc3 Uc3
    {
        get { return _uc2.Uc3; }
    }
}

}