关于动态加载用户控件的问题
今天闲着没事,做了一个动态加载用户控件的实验,结果发现了一个问题。
用户控件:TimeDisplay.ascx,里面只有一个LinkButton代码如下
1 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="TimeDisplay.ascx.cs" Inherits="TimeDisplay" %>
2 <asp:LinkButton ID="LinkButton1" runat="server"/>
3
2 <asp:LinkButton ID="LinkButton1" runat="server"/>
3
TimeDisplay.ascx.cs代码
1 public partial class TimeDisplay : System.Web.UI.UserControl
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!IsPostBack)
6 {
7 RefreshTime();
8
9
10 }
11 LinkButton1.Click += (d, g) => { RefreshTime(); };
12 }
13 /// <summary>
14 /// ssdfsdfsdfsdfsdfsdf
15 /// </summary>
16 public void RefreshTime()
17 {
18 if (format == null)
19 {
20 LinkButton1.Text = DateTime.Now.ToLongTimeString();
21 }
22 else
23 {
24 LinkButton1.Text = DateTime.Now.ToString(format);
25 }
26 }
27
28 public string format { get; set; }
29
30 }
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!IsPostBack)
6 {
7 RefreshTime();
8
9
10 }
11 LinkButton1.Click += (d, g) => { RefreshTime(); };
12 }
13 /// <summary>
14 /// ssdfsdfsdfsdfsdfsdf
15 /// </summary>
16 public void RefreshTime()
17 {
18 if (format == null)
19 {
20 LinkButton1.Text = DateTime.Now.ToLongTimeString();
21 }
22 else
23 {
24 LinkButton1.Text = DateTime.Now.ToString(format);
25 }
26 }
27
28 public string format { get; set; }
29
30 }
此代码定义了一个RefreshTime()方法将LinkButton的Text属性显示为当前时间,并且定义了一个format属性,这个属性是用来格式化时间的格式的。
在宿主页面Default.aspx.cs中的Page_Load事件中动态加载TimeDisplay用户控件。
代码如下
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 UserControl mycontrol = (UserControl)Page.LoadControl("TimeDisplay.ascx");
4 PlaceHolder1.Controls.Add(mycontrol);
5 }
2 {
3 UserControl mycontrol = (UserControl)Page.LoadControl("TimeDisplay.ascx");
4 PlaceHolder1.Controls.Add(mycontrol);
5 }
运行结果正常,页面显示如下。
但是如果我想在动态加载用户控件的时候要指定这个用户控件的 format属性时,问题来了,mycontrol并不包含format属性,原因是mycontrol的类型是UserControl,而TimeDisplay控件的类型就是它本身TimeDisplay类型,所以mycontrol中并没有format属性。
于是我尝试下面这种方法,代码如下:
代码
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 TimeDisplay timedisplay = (TimeDisplay)Page.LoadControl("TimeDisplay.ascx");
4 timedisplay.format = "yyyy-MM-dd hh:mm:ss";
5 PlaceHolder1.Controls.Add(timedisplay);
6
7 }
2 {
3 TimeDisplay timedisplay = (TimeDisplay)Page.LoadControl("TimeDisplay.ascx");
4 timedisplay.format = "yyyy-MM-dd hh:mm:ss";
5 PlaceHolder1.Controls.Add(timedisplay);
6
7 }
此时vs2008提示说:
错误 3 找不到类型或命名空间名称“TimeDisplay”(是否缺少 using 指令或程序集引用?) E:\练习\ASP.NET3.5高级编程\Chapter15\Default.aspx.cs 12 36 E:\...\Chapter15\
看到这个错误让我很摸不着头脑,于是我很暴力的运行了一下,结果通过了。
结果如下:
为什么为这样呢,编译器提示缺少命名空间的错误,可是编译却没有出错也能够正常运行,那为什么vs2008却出现错误提示呢,怎么做才能让编译器不报错呢?虽然能够运行,但是看着编译器给画出的一道道红线心里就是不爽,不知哪位高手能指导下,谢谢!