您的位置:首页 > 编程语言 > ASP

ASP.NET 动态添加自定义控件

2011-05-17 10:14 281 查看
动态添加自定义控件能加载控件不同设计的风格。满足不同的需求

下面的动态添加就是实现,当用户选择不同的问题类型时那么问题的控件也就不同,取决于用户所选的问题类型,这里只设计两个问题的自定义控件,实现控件的动态加载,两个控件的代码如下:(我的两个控件都是将源于后台写在同一个页面)

ASPNetSurvey.ascx:

<%@ Control Language="C#" ClassName="ASPNetSurvey" %>

<script runat="server">

public bool KnowFast
{
get
{
return chkFast.Checked;
}
}


public bool KnowNewest
{
get
{
return chkNewest.Checked;
}
}

</script>


<asp:CheckBox ID="chkFast" Text="Did you know that ASP.NET is fast?" runat="server" />
<br />
<br />
<asp:CheckBox ID="chkNewest" Text="Did you know that ASP.NET is the newest Microsoft
technology for building Web applications?" runat="server" />
<br />
<br />


上面这个界面有两个属性,获取页面中Checkbox的选定状态,下面一个同样:

ASPSurvey.ascx:

<%@ Control Language="C#" ClassName="ASPSurvey" %>

<script runat="server">

public bool KnowSlow
{
get
{
return chkSlow.Checked;
}
}


public bool KnowOutdated
{
get
{
return chkOutdated.Checked;
}
}

</script>


<asp:CheckBox ID="chkSlow" Text="Did you know that ASP Classic is slow?" runat="server" />
<br />
<br />
<asp:CheckBox ID="chkOutdated" Text="Did you know that ASP Classic is outdated?"
runat="server" />
<br />
<br />


下面这一个是动态调用这两个控件的代码(源与后台代码在同一个界面):

WebSurvey.aspx:

<%@ Page Language="C#" %>

<%@ Reference Control="~/ASPSurvey.ascx" %>
<%@ Reference Control="~/ASPNetSurvey.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "
http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script runat="server">

private Control _survey = null;

void Page_Load()
{
switch(ddlLanguage.SelectedIndex)
{
case 1:
_survey = Page.LoadControl("ASPSurvey.ascx");
break;
case 2:
_survey = Page.LoadControl("ASPNetSurvey.ascx");
break;
}


if(_survey != null)
PlaceHolder1.Controls.Add(_survey);
}


protected void btnSubmit_Click(object sender ,EventArgs e)
{
switch(ddlLanguage.SelectedIndex)
{
case 1:
ASPSurvey aspResults = (ASPSurvey)_survey;
ltlResults.Text = "<h1>ASP Survey</h1>";
ltlResults.Text += "<br />Know slow? " + aspResults.KnowSlow.ToString();
ltlResults.Text += "<br />Know outdated? " + aspResults.KnowOutdated.ToString();
break;
case 2:
ASPNetSurvey aspNetResults = (ASPNetSurvey)_survey;
ltlResults.Text = "<h1>ASP.NET Survey</h1>";
ltlResults.Text += "<br />Know fast? " + aspNetResults.KnowFast.ToString();
ltlResults.Text += "<br />Know newest? " + aspNetResults.KnowNewest.ToString();
break;
}
}
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<style type="text/css">
html
{
font:14px Arial,Sans-Serif;
}
</style>
<title>Web Survey</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblLanguage" Text="What language do you use to develop Web applications?"
runat="server" />
<br />
<asp:DropDownList ID="ddlLanguage" ToolTip="Web application language (reloads form)"
AutoPostBack="true" runat="server">
<asp:ListItem Text="Select Language" />
<asp:ListItem Text="ASP Classic" />
<asp:ListItem Text="ASP.NET" />
</asp:DropDownList>
<br />
<br />
<asp:PlaceHolder ID="PlaceHolder1" runat="server" />
<asp:Button ID="btnSubmit" Text="Submit" OnClick="btnSubmit_Click" runat="server" />
<hr />
<asp:Literal ID="ltlResults" runat="server" />
</div>
</form>
</body>
</html>


上面这个页面的代码,有很多地方需要提出来一下:

第一:对于加载的动态控件,如果包含自定义的属性和方法,那么在引用的时候必须使用<%@Reference%>,这里就有个区别了,如果是直接加载一个没有添加自定义成分的用户控件,则之需要用Page.Load()方法即可,一旦有自定义的成分(属性,方法,事件。。)就需要引用上面的指令了。如果不是动态添加的话,我们一般是使用<%@ Register %>指令,这两个怎么区分理解呢:前一个指令 是“引用”,毕竟这个控件没用放到这个页面临时加载而已,故只需要引用就够了,对于不是动态的我们用后一个指令“注册”,这样的指令可以理解为:我需要把一个控件拖到我的页面,贮存在我的页面,需要长时间存在了(除非你删除),那么我就需要注册了,这其实跟生活中的例子一样

第二,用户控件都是控件类,都是在System.Web.UI下的控件类,这里在引用ascx文件的控件类的属性时,只需要先实例化引用的用户控件类,在获取类中的属性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: