动态控件添加解决方案
\n
你可能因为动态添加的控件回传消失而苦烦过吧。
你可能因为动态添加的控件内部事件无法执行而烦过吧。
开始吧。
解决的动态控件添加问题.
做了一个示例:
\n
新建一个类:class1.cs
\n
\n
我在csdn博客上,发现了这个控件。
using System.Web.UI.Design;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Xml;
using System.Collections;
using System.Web;
using System;
namespace cn.co
{
\n
[ToolboxData("<{0}:DynamicControlsPanel runat=server></{0}:DynamicControlsPanel>")]
\n
public class DynamicControlsPanel : Panel
{
#region 自定义的属性
\n
[DefaultValue(HandleDynamicControls.DontPersist)]
public HandleDynamicControls ControlsWithoutIDs
{
get
{
if (ViewState["ControlsWithoutIDs"] == null)
return HandleDynamicControls.DontPersist;
else
return (HandleDynamicControls)ViewState["ControlsWithoutIDs"];
}
set { ViewState["ControlsWithoutIDs"] = value; }
}
\n
#endregion 自定义的属性
\n
#region 视图状态管理
\n
protected override void LoadViewState(object savedState)
{
object[] viewState = (object[])savedState;
\n
Pair persistInfo = (Pair)viewState[0];
foreach (Pair pair in (ArrayList)persistInfo.Second)
{
RestoreChildStructure(pair, this);
}
\n
base.LoadViewState(viewState[1]);
}
\n
protected override object SaveViewState()
{
\n
if (HttpContext.Current == null)
return null;
\n
object[] viewState = new object[2];
viewState[0] = PersistChildStructure(this, “C”);
viewState[1] = base.SaveViewState();
return viewState;
}
\n
private void RestoreChildStructure(Pair persistInfo, Control parent)
{
Control control;
\n
string[] persistedString = persistInfo.First.ToString().Split(‘;’);
\n
string[] typeName = persistedString[1].Split(‘:’);
switch (typeName[0])
{
\n
case “C”:
Type type = Type.GetType(typeName[1], true, true);
try
{
control = (Control)Activator.CreateInstance(type);
}
catch (Exception e)
{
throw new ArgumentException(String.Format(“类型 ‘{0}’ 不能恢复状态”, type.
\n
ToString()), e);
}
break;
default:
throw new ArgumentException(“无法识别的类型.不能恢复状态.”);
}
\n
control.ID = persistedString[2];
\n
switch (persistedString[0])
{
case “C”:
parent.Controls.Add(control);
break;
}
\n
foreach (Pair pair in (ArrayList)persistInfo.Second)
{
RestoreChildStructure(pair, control);
}
}
\n
private Pair PersistChildStructure(Control control, string controlCollectionName)
{
string typeName;
ArrayList childPersistInfo = new ArrayList();
\n
if (control.ID == null)
{
if (ControlsWithoutIDs == HandleDynamicControls.ThrowException)
throw new NotSupportedException(“你必须设置你的ID”);
else if (ControlsWithoutIDs == HandleDynamicControls.DontPersist)
return null;
}
\n
typeName = “C:” + control.GetType().AssemblyQualifiedName;
\n
string persistedString = controlCollectionName + “;” + typeName + “;” + control.ID;
\n
if (!(control is UserControl) && !(control is CheckBoxList))
{
for (int counter = 0; counter < control.Controls.Count; counter++)
{
Control child = control.Controls[counter];
Pair pair = PersistChildStructure(child, “C”);
if (pair != null)
childPersistInfo.Add(pair);
}
}
\n
return new Pair(persistedString, childPersistInfo);
}
#endregion 视图状态管理
\n
#region 重化控件样式
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
base.Render(writer);
}
//
#endregion 重化控件样式
}
\n
public enum HandleDynamicControls
{
DontPersist,
Persist,
ThrowException
}
}
default7.aspx页面代码
\n
\n
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default7.aspx.cs” Inherits=”Default7″ %>
\n<%@ Register Namespace=”cn.co” TagPrefix=”tt” %>
\n
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
\n
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>无标题页</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<asp:RadioButtonList ID=”RadioButtonList1″ runat=”server” AutoPostBack=”True” OnSelectedIndexChanged=”RadioButtonList1_SelectedIndexChanged”>
<asp:ListItem>0</asp:ListItem>
<asp:ListItem>1</asp:ListItem>
</asp:RadioButtonList>
<tt:DynamicControlsPanel ControlsWithoutIDs=Persist runat=server ID=”pan”></tt:DynamicControlsPanel>
</div>
\n
\n
</form>
</body>
</html>
default7.aspx.cs页面
\n
\n
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
\n
public partial class Default7 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
\n
}
protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (this.RadioButtonList1.SelectedValue)
{
case “0″:
Control con=Page.LoadControl(“0.ascx”);
con.ID = “dd”;
this.pan.Controls.Clear();
this.pan.Controls.Add(con);
break;
\n
case “1″: Control con1 = Page.LoadControl(“1.ascx”);
con1.ID = “ddd”;
this.pan.Controls.Clear();
this.pan.Controls.Add(con1);
break;
}
}
}
还有两个o.ascx,1.ascs页面。
代码分别为
0.ascx
前台
\n
<%@ Control Language=”C#” AutoEventWireup=”true” CodeFile=”0.ascx.cs” Inherits=”_0″ %>
0控件。<br />
<asp:Button ID=”Button1″ runat=”server” onClick=”Button1_Click” Text=”0控件” />
\n
后台
\n
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
\n
public partial class _0 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
\n
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(“0控件”);
}
}
\n
1.ascx
前台
<%@ Control Language=”C#” AutoEventWireup=”true” CodeFile=”1.ascx.cs” Inherits=”_1″ %>
1控件。<asp:Button ID=”Button1″ runat=”server” onClick=”Button1_Click” Text=”1控件” />
后台:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
\n
public partial class _1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
\n
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(“1控件”);
}
}
测试结果如图:
打开的页面:
\n
当我的点击时:
\n
当我们刷新时
结果还是
来源:suiqirui19872005的cnblogs