如何动态加载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
 }
}

 

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

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值