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文件的控件类的属性时,只需要先实例化引用的用户控件类,在获取类中的属性
下面的动态添加就是实现,当用户选择不同的问题类型时那么问题的控件也就不同,取决于用户所选的问题类型,这里只设计两个问题的自定义控件,实现控件的动态加载,两个控件的代码如下:(我的两个控件都是将源于后台写在同一个页面)
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文件的控件类的属性时,只需要先实例化引用的用户控件类,在获取类中的属性
相关文章推荐
- ASP.NET 动态添加自定义控件
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
- ASP.NET动态添加用户控件的方法
- 在ASP.NET页面中动态添加控件
- 在ASP_NET页面中动态添加控件 - 陈希章 - 博客园
- ASP.NET动态添加多附件
- ASP.NET 2.0中动态添加GridView
- asp.net后台动态添加JS文件和css文件的引用实现方法
- asp.net后台如何动态添加JS文件和css文件的引用
- asp.net 动态添加多附件上传.
- 在ASP.NET页面中动态添加控件
- asp.net 动态添加 treeview 递归
- Asp.net 动态创建的控件并添加事件,无响应的解决方法。
- asp.net Repeater 动态添加模板列生成Table
- 原创asp.net动态添加网站seo的标题、关键词、描述的方法
- ASP.NET 2.0 中动态添加 GridView 模板列的例子
- asp.net gridview动态添加列,并获取其数据;
- Asp.Net中动态初始化、添加TreeView中数据
- asp.net为控件动态添加事件