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是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!
Label1是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!
#4
WebControl_MyControl control = new WebControl_MyControl();
Panel1.Controls.Add(control );
改为:
Panel1.Controls.Add(LoadControl("WebControl_MyControl.ascx"));
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>
你试试这个看看,然后看看你的代码有什么不同
<%@ 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
才奇怪了
又不是纯虚类
为什么不能new
才奇怪了
#8
按照cat_hsfz的方法解决了问题,非常感谢!
不过我和blackant2(乔峰)一样,很想了解其中的原委,还请附加说明!谢谢!
不管是否回复,今晚结贴!
不过我和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/
第一次: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上面的逻辑执行了没有
看看能不能使用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类
<%=%>
和<%#%>
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是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!
Label1是直接在工具箱中拖到界面上的,
按理应该初始化了,这里却为空,百思不得其解!!
#4
WebControl_MyControl control = new WebControl_MyControl();
Panel1.Controls.Add(control );
改为:
Panel1.Controls.Add(LoadControl("WebControl_MyControl.ascx"));
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>
你试试这个看看,然后看看你的代码有什么不同
<%@ 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
才奇怪了
又不是纯虚类
为什么不能new
才奇怪了
#8
按照cat_hsfz的方法解决了问题,非常感谢!
不过我和blackant2(乔峰)一样,很想了解其中的原委,还请附加说明!谢谢!
不管是否回复,今晚结贴!
不过我和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/
第一次: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上面的逻辑执行了没有
看看能不能使用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类
<%=%>
和<%#%>
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类