• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
一个具有上进心的码农
因为一篇文章中有很多是从很多篇文章中摘取的,请恕我没有一一说明摘取出处,如果没有说明,则该文章默认是摘取,如有侵犯您的权益,请与我联系,将会马上删除。
博客园    首页    新随笔    联系   管理    订阅  订阅

动态添加控件之方案

在网上面发现了一个很好的解决方案。

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
{


    [ToolboxData(
"<{0}:DynamicControlsPanel runat=server></{0}:DynamicControlsPanel>")]

    
public class DynamicControlsPanel : Panel
    
{
        
自定义的属性#region 自定义的属性


        [DefaultValue(HandleDynamicControls.DontPersist)]
        
public HandleDynamicControls ControlsWithoutIDs
        
{
            
get
            
{
                
if (ViewState["ControlsWithoutIDs"] == null)
                    
return HandleDynamicControls.DontPersist;
                
else
                    
return (HandleDynamicControls)ViewState["ControlsWithoutIDs"];
            }

            
set { ViewState["ControlsWithoutIDs"] = value; }
        }


        
#endregion
 自定义的属性

        
视图状态管理#region 视图状态管理

        
protected override void LoadViewState(object savedState)
        
{
            
object[] viewState = (object[])savedState;

            Pair persistInfo 
= (Pair)viewState[0];
            
foreach (Pair pair in (ArrayList)persistInfo.Second)
            
{
                RestoreChildStructure(pair, 
this);
            }


            
base.LoadViewState(viewState[1]);
        }


        
protected override object SaveViewState()
        
{

            
if (HttpContext.Current == null)
                
return null;

            
object[] viewState = new object[2];
            viewState[
0] = PersistChildStructure(this, "C");
            viewState[
1] = base.SaveViewState();
            
return viewState;
        }


        
private void RestoreChildStructure(Pair persistInfo, Control parent)
        
{
            Control control;

            
string[] persistedString = persistInfo.First.ToString().Split(';');

            
string[] typeName = persistedString[1].Split(':');
            
switch (typeName[0])
            
{

                
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.

                  ToString()), e);
                    }

                    
break;
                
default:
                    
throw new ArgumentException("无法识别的类型.不能恢复状态.");
            }


            control.ID 
= persistedString[2];

            
switch (persistedString[0])
            
{
                
case "C":
                    parent.Controls.Add(control);
                    
break;
            }


            
foreach (Pair pair in (ArrayList)persistInfo.Second)
            
{
                RestoreChildStructure(pair, control);
            }

        }


        
private Pair PersistChildStructure(Control control, string controlCollectionName)
        
{
            
string typeName;
            ArrayList childPersistInfo 
= new ArrayList();

            
if (control.ID == null)
            
{
                
if (ControlsWithoutIDs == HandleDynamicControls.ThrowException)
                    
throw new NotSupportedException("你必须设置你的ID");
                
else if (ControlsWithoutIDs == HandleDynamicControls.DontPersist)
                    
return null;
            }


            typeName 
= "C:" + control.GetType().AssemblyQualifiedName;

            
string persistedString = controlCollectionName + ";" + typeName + ";" + control.ID;

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

            }


            
return new Pair(persistedString, childPersistInfo);
        }

        
#endregion
 视图状态管理

        
重化控件样式#region 重化控件样式
        
protected override void Render(System.Web.UI.HtmlTextWriter writer)
        
{
            
base.Render(writer);
        }

        
//  
        #endregion
 重化控件样式
    }


    
public enum HandleDynamicControls
    
{
        DontPersist,
        Persist,
        ThrowException
    }

}







<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default7.aspx.cs" Inherits="Default7" %>

 

 

<%@ Register Namespace="cn.co" TagPrefix="tt" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

        

    
</form>
</body>
</html>


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;

public partial class Default7 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }

 
    
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;

          
case "1": Control con1 = Page.LoadControl("1.ascx");
            con1.ID 
= "ddd";
                
this.pan.Controls.Clear();
                
this.pan.Controls.Add(con1);
                
break;
        }

    }

}

posted @ 2008-06-18 18:21  不若相忘于江湖  阅读(294)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3