我有一个基本用户控件(WC1),它继承自WebUserControl和一个继承自WC1的子用户控件(WC2)。我在vs设计视图中向WC1添加了一个textBox和一个标签,而不是后面的代码。 但是我放在WC1中的所有服务器控件都是null并且给出了空指针异常。我试图在不同的事件中访问textBox和label但是所有这些都是null。
有人知道这里出了什么问题吗?谢谢。
重现错误的步骤:
代码:
WC1:
code behind:
public partial class WC1: System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
页:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WC1.ascx.cs" Inherits="WebApplication1.WC1" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
WC2: 代码背后:
public partial class WC2: WC1
{ var txt = TextBox1.Text}
页:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WC2.ascx.cs" Inherits="WebApplication1.WC2" %>
总结我的问题:
在这种情况下可以实例化WC1的Web服务器控件吗?或者用户控件是否可以继承其他用户控件并将父级用户控件的Web服务器控件传送给其子级而无需担心布局?
好的,我测试过如果我不在WC1代码隐藏中添加控件,它将永远不会被实例化。
答案 0 :(得分:1)
如果您没有将基本类型设置为WC1,那么当您将控件添加到标记时,控件是在WC2的 designer.cs 中创建的,而这些控件是隐藏的继承自WC1。
要解决这个问题,只需打开WC2的designer.cs并删除控件,然后基类上的那些将成为编译时标记的内容。替代解决方案:确保您的基类是WC1,删除设计器,右键单击.ascx,然后选择转换为Web应用程序,这将重新生成设计器而不创建它找到的控件基类......同样的效果。
如果我误解了你,并且你试图继承基本控件的标记 ....你不能这样做,想想它将如何渲染,会是什么在哪里?如果它是其他的全部在一起,请发布你的标记和属性两个控件,这将清楚地说明发生了什么。