动态使用自定义控件,在自定义控件的Page_Load里界面上的系统控件都为空!!感觉控件没有初始化!!

时间:2022-09-29 20:39:41
自定义控件的Page_Load()内容如下:
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = “Hello World!!”;  //----------------(1)
    }

使用控件的页面代码如下:
  
    WebControl_MyControl control = new WebControl_MyControl();
    Panel1.Controls.Add(control );

运行时跟踪代码到(1)处,Label1却为空!!不知是和原因!?

开发环境为 VS2005

11 个解决方案

#1


最好把相关代码贴出来
不然不好知道原因

#2


应该不会呀.是Label1这个控件为空的意思?

#3


对,就是Label1这个控件为空,不能为其赋值!
Label1是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!

#4


WebControl_MyControl control = new WebControl_MyControl();
Panel1.Controls.Add(control );

改为:

Panel1.Controls.Add(LoadControl("WebControl_MyControl.ascx"));

#5


不能用new MyControl的形式,只能用LoadControl("~/MyControl.ascx")的形式,这是UserControl的特性。如果你需要了解背后的细节,请回帖说明。

#6


自定义控件
<%@ Control Language="C#" ClassName="WebControl_MyControl"%>
<script runat="server">
    void Page_Load(object sender,EventArgs e) {
        lab.Text = "Hello World";
    }
</script>
<asp:Label runat="server" ID="lab"></asp:Label>
页面调用
<%@ Page Language="C#" %>

<%@ Register Src="WebControl_MyControl.ascx" TagName="WebControl_MyControl" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    void Page_Load(object sender, EventArgs e) {
        WebControl_MyControl wcmc = new WebControl_MyControl();
        form1.Controls.Add(wcmc);
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       
    </div>
    </form>
</body>
</html>
你试试这个看看,然后看看你的代码有什么不同

#7


回复人:cat_hsfz(我的Blog在http://purl.oclc.org/NET/cathsfz) 
又不是纯虚类
为什么不能new
才奇怪了

#8


按照cat_hsfz的方法解决了问题,非常感谢!
不过我和blackant2(乔峰)一样,很想了解其中的原委,还请附加说明!谢谢!
不管是否回复,今晚结贴!

#9


简单点说吧,一个code-behind的ascx被编译了两次:

第一次:MyControl类被编译,如果你用的是ASP.NET 2.0,那么所有在ascx上声明runat="server"的东西都将自动在MyControl的C#代码中添加对应的声明(而在ASP.NET 1.x这个工作在设计时由VS2002/2003完成)。

第二次:继承自MyControl类,使用解释器分析ascx上的内容,将其中的逻辑编译。这样说你可能不明白是什么意思,例如你在ascx中用到了<%= %>或者<%# %>,这些就是在第二次编译时才被收录的逻辑。这个编译出来的类没有确切的名称,是ASP.NET运行时动态编译的临时类,生成一个临时的assembly。

如果你用new MyControl,显然得到的是第一次编译的结果,这样所有在ascx上面的逻辑都不会被执行。

详细来说……嗯……那个我正在写,我正在自己的blog上写ASP.NET动态控件的专题,有兴趣的话你可以关注:
http://cathsfz.cnblogs.com/

#10


你试试我的示例
看看能不能使用new 
看看ascx上面的逻辑执行了没有

#11


我又试了试你说的
<%=%>
和<%#%>

usercontrol全例如下
<%@ Control Language="C#" ClassName="WebControl_MyControl"%>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    DataTable CreateNewTable(){
DataTable dt=new DataTable();
dt.Columns.Add(new DataColumn("name",typeof(string)));
dt.Columns.Add(new DataColumn("value",typeof(int)));
DataRow dr;
for(int i=0;i<10;i++){
dr=dt.NewRow();
dr["name"]=i.ToString("x2");
dr["value"]=i;
dt.Rows.Add(dr);
}
return dt;
}
    
    void Page_Load(object sender,EventArgs e) {
        rep.DataSource = CreateNewTable().DefaultView;
        rep.DataBind();
        lab.Text = "这是一个指定控件属性的示例";
    }
</script>
<asp:Label runat="server" ID="lab"></asp:Label>
<br />
<%= "这是一个测试输出的示例"%><br />
这是一个数据绑定的示例<br />
<asp:Repeater runat="server" ID="rep">
<HeaderTemplate><table></HeaderTemplate>
    <ItemTemplate>
        <tr>
        <td><%#DataBinder.Eval(Container.DataItem,"name",String.Empty)%></td>
        <td><%#DataBinder.Eval(Container.DataItem,"value",String.Empty)%></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
    </table>
    </FooterTemplate>
</asp:Repeater>

调用页面如下
<%@ Page Language="C#" %>
<%@ Register Src="WebControl_MyControl.ascx" TagName="WebControl_MyControl" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    void Page_Load(object sender, EventArgs e) {
        WebControl_MyControl wcmc = new WebControl_MyControl();
        form1.Controls.Add(wcmc);
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       
    </div>
    </form>
</body>
</html>

没有你说的这些我不懂的情况下
new 一下完全可以的,而且我也想不通为什么不能new一个usercontrol类

#1


最好把相关代码贴出来
不然不好知道原因

#2


应该不会呀.是Label1这个控件为空的意思?

#3


对,就是Label1这个控件为空,不能为其赋值!
Label1是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!

#4


WebControl_MyControl control = new WebControl_MyControl();
Panel1.Controls.Add(control );

改为:

Panel1.Controls.Add(LoadControl("WebControl_MyControl.ascx"));

#5


不能用new MyControl的形式,只能用LoadControl("~/MyControl.ascx")的形式,这是UserControl的特性。如果你需要了解背后的细节,请回帖说明。

#6


自定义控件
<%@ Control Language="C#" ClassName="WebControl_MyControl"%>
<script runat="server">
    void Page_Load(object sender,EventArgs e) {
        lab.Text = "Hello World";
    }
</script>
<asp:Label runat="server" ID="lab"></asp:Label>
页面调用
<%@ Page Language="C#" %>

<%@ Register Src="WebControl_MyControl.ascx" TagName="WebControl_MyControl" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    void Page_Load(object sender, EventArgs e) {
        WebControl_MyControl wcmc = new WebControl_MyControl();
        form1.Controls.Add(wcmc);
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       
    </div>
    </form>
</body>
</html>
你试试这个看看,然后看看你的代码有什么不同

#7


回复人:cat_hsfz(我的Blog在http://purl.oclc.org/NET/cathsfz) 
又不是纯虚类
为什么不能new
才奇怪了

#8


按照cat_hsfz的方法解决了问题,非常感谢!
不过我和blackant2(乔峰)一样,很想了解其中的原委,还请附加说明!谢谢!
不管是否回复,今晚结贴!

#9


简单点说吧,一个code-behind的ascx被编译了两次:

第一次:MyControl类被编译,如果你用的是ASP.NET 2.0,那么所有在ascx上声明runat="server"的东西都将自动在MyControl的C#代码中添加对应的声明(而在ASP.NET 1.x这个工作在设计时由VS2002/2003完成)。

第二次:继承自MyControl类,使用解释器分析ascx上的内容,将其中的逻辑编译。这样说你可能不明白是什么意思,例如你在ascx中用到了<%= %>或者<%# %>,这些就是在第二次编译时才被收录的逻辑。这个编译出来的类没有确切的名称,是ASP.NET运行时动态编译的临时类,生成一个临时的assembly。

如果你用new MyControl,显然得到的是第一次编译的结果,这样所有在ascx上面的逻辑都不会被执行。

详细来说……嗯……那个我正在写,我正在自己的blog上写ASP.NET动态控件的专题,有兴趣的话你可以关注:
http://cathsfz.cnblogs.com/

#10


你试试我的示例
看看能不能使用new 
看看ascx上面的逻辑执行了没有

#11


我又试了试你说的
<%=%>
和<%#%>

usercontrol全例如下
<%@ Control Language="C#" ClassName="WebControl_MyControl"%>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    DataTable CreateNewTable(){
DataTable dt=new DataTable();
dt.Columns.Add(new DataColumn("name",typeof(string)));
dt.Columns.Add(new DataColumn("value",typeof(int)));
DataRow dr;
for(int i=0;i<10;i++){
dr=dt.NewRow();
dr["name"]=i.ToString("x2");
dr["value"]=i;
dt.Rows.Add(dr);
}
return dt;
}
    
    void Page_Load(object sender,EventArgs e) {
        rep.DataSource = CreateNewTable().DefaultView;
        rep.DataBind();
        lab.Text = "这是一个指定控件属性的示例";
    }
</script>
<asp:Label runat="server" ID="lab"></asp:Label>
<br />
<%= "这是一个测试输出的示例"%><br />
这是一个数据绑定的示例<br />
<asp:Repeater runat="server" ID="rep">
<HeaderTemplate><table></HeaderTemplate>
    <ItemTemplate>
        <tr>
        <td><%#DataBinder.Eval(Container.DataItem,"name",String.Empty)%></td>
        <td><%#DataBinder.Eval(Container.DataItem,"value",String.Empty)%></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
    </table>
    </FooterTemplate>
</asp:Repeater>

调用页面如下
<%@ Page Language="C#" %>
<%@ Register Src="WebControl_MyControl.ascx" TagName="WebControl_MyControl" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    void Page_Load(object sender, EventArgs e) {
        WebControl_MyControl wcmc = new WebControl_MyControl();
        form1.Controls.Add(wcmc);
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       
    </div>
    </form>
</body>
</html>

没有你说的这些我不懂的情况下
new 一下完全可以的,而且我也想不通为什么不能new一个usercontrol类