当前位置:首页 > 动态控件添加终极解决方案

动态控件添加终极解决方案

点击次数:1372  更新日期:2010-12-28
\n

动态控件添加解决方案


\n

你可能因为动态添加的控件回传消失而苦烦过吧。
你可能因为动态添加的控件内部事件无法执行而烦过吧。
开始吧。
解决的动态控件添加问题.

\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
}
}

\n

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>

\n

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;
}
}
}

\n

还有两个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



当我的点击时:


\n




当我们刷新时

结果还是


来源:suiqirui19872005的cnblogs

\n