自定义模板列在 PostBack 后消失的问题
2013-07-03 17:16
495 查看
昨天写的自定义模板今天再去做测试的时候玩不转了主要是俩个问题,同样都发生在页面回发时:
没有为该对象定义无参数的构造函数
点击画面任何需要PostBack 的按钮就会抛出一个异常:
眨眼一看还以为是JS的错误,然后突然意识到可能是跟序列化有关。因为之前在使用需要跨页传递Model或者使用
此时再运行,谢天谢地,终于过去,已经加载出新的页面的,但是BUG来了。。。
2.自定义的模板列在PostBack 后消失
初始加载的页面(模板列和普通列都正常)
翻页或者查询等动作PostBack后的页面(模板列好像消失了一样)
仔细去看的时候发现其实模板列并没有消失,只是我们定义的中间控件消失了,但是同样是动态创建的 BoundField 类型的普通列并没有异常,猜想应该是我们自定义的控件状态没有被保存,而BoundField 的内容可能会包含某种状态保存的标记(像 Serializable 序列化标记一样)而被.Net 框架保存处理了。
然后我们在
在这里看不到我们想要的,但是看到他的父类 DataControlField ,看到带有 Data 这四个字的时候我已经觉得猜对了一半,果然在DataControlField 的定义中:
找到了
然后返回 BoundField 的定义果然发现已经重载了所有 IStateManager 声明的方法
这下咱们的想法验证了,现在有俩条路可走,要么去实现
这些做完,测试一下,终于可以正常了!
跟序列化相关的
其实如果把这俩个问题调整一下顺序,先解决显示的问题,把动态列的定义放在
现在静下心来总结一下,小小的模板列其实里面包含了太多的东西,从数据容器到控件,从数据绑定到控件赋值,然后就是PostBack之间状态的保存。我觉得或许只是一个最简单的
平常用惯了简单上手的东西,根本认识不到即便是最简单的控件都是 大神们 精心封装好的!再次膜拜一下在程序员道路上的先烈们!
不禁想起这段很在流行的那首诗:
问,锄禾跟几个人发生了不正当关系?不禁感概一粒米中竟然有那么多关系,
所以嘛: 万恶的
没有为该对象定义无参数的构造函数
点击画面任何需要PostBack 的按钮就会抛出一个异常:
眨眼一看还以为是JS的错误,然后突然意识到可能是跟序列化有关。因为之前在使用需要跨页传递Model或者使用
Serializable标记的类时经常出现缺少默认构造的异常提示,然后就只能乖乖添加一个空的构造函数。好吧,还是去默默修改昨天继承 ITemplate 的两个类(
ItemTemplateLinkBtn、
ItemTemplateLabel) ,为它们添加默认的空构造。如下:
<!-- lang: c# --> #region Item Template for Link Button /// <summary> /// 为超链接创建模板元素 /// </summary> public class ItemTemplateLinkBtn : ITemplate { /// <summary> /// 序列化使用 /// </summary> public ItemTemplateLinkBtn() { } /// <summary> /// 构造函数 /// </summary> /// <param name="ColText">列名</param> /// <param name="navigateURL">URL格式化字符串</param> /// <param name="mGuid">绑定的列名(暂时只支持一个)</param> public ItemTemplateLinkBtn(string ColText, string navigateURL, string ColumnGuid) { this.strColumnText = ColText; this.FormatString = navigateURL; this.FieldGuid = ColumnGuid; } ........... #region Item Template for Label /// <summary> /// 创建标签模板 /// </summary> public class ItemTemplateLabel : ITemplate { /// <summary> /// 序列化 /// </summary> public ItemTemplateLabel() { } ......
此时再运行,谢天谢地,终于过去,已经加载出新的页面的,但是BUG来了。。。
2.自定义的模板列在PostBack 后消失
初始加载的页面(模板列和普通列都正常)
翻页或者查询等动作PostBack后的页面(模板列好像消失了一样)
仔细去看的时候发现其实模板列并没有消失,只是我们定义的中间控件消失了,但是同样是动态创建的 BoundField 类型的普通列并没有异常,猜想应该是我们自定义的控件状态没有被保存,而BoundField 的内容可能会包含某种状态保存的标记(像 Serializable 序列化标记一样)而被.Net 框架保存处理了。
然后我们在
BoundFieldF12 到它的定义
<!-- lang: c# --> // 摘要: // 表示数据绑定控件中作为文本显示的字段。 public class BoundField : DataControlField
在这里看不到我们想要的,但是看到他的父类 DataControlField ,看到带有 Data 这四个字的时候我已经觉得猜对了一半,果然在DataControlField 的定义中:
<!-- lang: c# --> public abstract class DataControlField : IStateManager, IDataSourceViewSchemaAccessor
找到了
然后返回 BoundField 的定义果然发现已经重载了所有 IStateManager 声明的方法
这下咱们的想法验证了,现在有俩条路可走,要么去实现
IStateManager,要么人为地更新状态。前者,对不起,一切关于框架的东东对于我这个菜鸟太难了,凑个热闹看下意思,膜拜下大神们的神来之笔就好了,那还是挑个简单的吧。既然模板列的状态丢了那只要保证每次更新模板列的定义就可以了。所以我们被迫每次都要在数据绑定前重新定义模板列的内容。建议在GrideView_Init 或者 Page_Init 事件中创建。
<!-- lang: c# --> #region 构造和初始化 /// <summary> /// 数据加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 是否可以编辑 if (_TableScheme.ReadOnly == true) BtnEdit.Visible = false; // 数据绑定方法 PageGrideDefaultLoad(); } // 各行变色 ExcuteJs(this, "gridviewColor('gdvPageView')"); } /// <summary> /// 初始化表格 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gdvPageView_Init(object sender, EventArgs e) { if (!IsPostBack) { // 数据表结构只缓存一次 PageID = Request.QueryString["PAGEID"]; _TableScheme = LibSchemeBLL.Instance.GenerateTableScheme(PageID); } // 生成列 GenerateGrideColumn(); } #endregion
这些做完,测试一下,终于可以正常了!
跟序列化相关的
其实如果把这俩个问题调整一下顺序,先解决显示的问题,把动态列的定义放在
Init中实现时,第一个序列化的问题就没有了,至于什么原因我就解释不清楚了。大概是因为恢复控件状态要利用类似反序列化的机制吧。
现在静下心来总结一下,小小的模板列其实里面包含了太多的东西,从数据容器到控件,从数据绑定到控件赋值,然后就是PostBack之间状态的保存。我觉得或许只是一个最简单的
Lable也是要包含这么多东东的,突然想到
TextBox在 ReadOnly 后前台的赋值后台也是读不到了,不也是控件状态的问题吗?
平常用惯了简单上手的东西,根本认识不到即便是最简单的控件都是 大神们 精心封装好的!再次膜拜一下在程序员道路上的先烈们!
不禁想起这段很在流行的那首诗:
<!-- lang: html --> 锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦!
问,锄禾跟几个人发生了不正当关系?不禁感概一粒米中竟然有那么多关系,
所以嘛: 万恶的
System.Web.UI.WebControls你到底有多少关系呀!!!
相关文章推荐
- <记录模板学习的问题>标准库提供的swap与自定义的swap冲突
- django自定义模板引用问题
- struts2自定义模板内存溢出 java.lang.OutOfMemoryError: Java heap space(问题已解决)
- 当UITableViewCell被选中时,上面的自定义view消失的问题
- 关于自定义UITableViewCell布局点击Cell消失的问题
- 当UITableViewCell被选中时,上面的自定义view消失的问题
- GridView动态添加模板列,并解决数据列PostBack后数据丢失问题!
- iOS自定义UITableCell自定义分割线消失问题
- 微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应(四)
- Discuz X2.5 前端模板自定义嵌入点问题
- 微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应
- EMF自定义jet模板不生效的问题
- C++ 模板中包含自定义类似编译问题
- GridView动态添加模板列,并解决数据列PostBack后数据丢失问题!
- asp.net GridView自定义模板列不可编辑列取值问题
- UITableView 自定义cell添加UIView作为分割线,选中消失的问题
- DetailsView在PostBack后消失问题解决
- 【模板算法】单源最短路问题-dijkstra算法(邻接表+优先队列优化)
- Discuz常见大问题-如何自定义单个页面
- 模板引擎.page 取值问题