如何动态加载web control在postback后记住视图状态(viewstate)

在设计ASP.NET的Web程序时,运行时加入的Web控件因在SaveViewState之后加入,postback后数据会丢失。本文通过重写表单的SaveViewState和LoadViewState,设计了一个继承自Panel的容器控件来解决该问题,给出了详细代码实现。

在我们设计asp.net的web程序时,有时表单上的web contorl不是在设计就有的。而是在运行时才加入的。可是这就带来了一个问题,就是web contorl因为在SaveViewState之后加入,所以并没有保存,在poskback后所有已写的数据,将丢失.如何来解决上面的问题呢。我写了一个算是个web contorl的容器控件,它的由Panel继承而来的。

主要是重写表单的SaveViewState和LoadViewState:

using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Xml;

namespace DBauer.Web.UI.WebControls
{
 [Designer("System.Web.UI.Design.ControlDesigner"), 
 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
 }
}

 

希望能给有这方面问题的朋友一点帮肋.同时也欢迎大家改写的更好

内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,涵盖正向与逆向运动学求解、正向动力学控制,并采用拉格朗日-欧拉法推导逆向动力学方程,所有内容均通过Matlab代码实现。同时结合RRT路径规划与B样条优化技术,提升机械臂运动轨迹的合理性与平滑性。文中还涉及多种先进算法与仿真技术的应用,如状态估计中的UKF、AUKF、EKF等滤波方法,以及PINN、INN、CNN-LSTM等神经网络模型在工程问题中的建模与求解,展示了Matlab在机器人控制、智能算法与系统仿真中的强大能力。; 适合人群:具备一定Ma六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)tlab编程基础,从事机器人控制、自动化、智能制造、人工智能等相关领域的科研人员及研究生;熟悉运动学、动力学建模或对神经网络在控制系统中应用感兴趣的工程技术人员。; 使用场景及目标:①实现六自由度机械臂的精确运动学与动力学建模;②利用人工神经网络解决传统解析方法难以处理的非线性控制问题;③结合路径规划与轨迹优化提升机械臂作业效率;④掌握基于Matlab的状态估计、数据融合与智能算法仿真方法; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解运动学建模与神经网络控制的设计流程,关注算法实现细节与仿真结果分析,同时参考文中提及的多种优化与估计方法拓展研究思路。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值