我有一个继承自uc2的用户控件(uc1)。 uc2在标记中声明了用户控件(uc3)。我试图从uc1访问uc3但我得到NullReferenceException。我认为由于继承uc3会实例化,但看起来我错过了一步。
澄清:
子用户控件如何从基类继承标记?基本用户控件中的服务器控件在基本用户控件的后面代码中为空。为什么呢?
答案 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; }
}
}
}