文档章节

自定义模板列在 PostBack 后消失的问题

夏至如沫
 夏至如沫
发布于 2013/07/03 17:16
字数 1293
阅读 109
收藏 0
点赞 0
评论 0

昨天写的自定义模板今天再去做测试的时候玩不转了主要是俩个问题,同样都发生在页面回发时:


  1. 没有为该对象定义无参数的构造函数

点击画面任何需要PostBack 的按钮就会抛出一个异常:

在此输入图片描述

眨眼一看还以为是JS的错误,然后突然意识到可能是跟序列化有关。因为之前在使用需要跨页传递Model或者使用 Serializable 标记的类时经常出现缺少默认构造的异常提示,然后就只能乖乖添加一个空的构造函数。好吧,还是去默默修改昨天继承 ITemplate 的两个类( ItemTemplateLinkBtnItemTemplateLabel) ,为它们添加默认的空构造。如下:

<!-- 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 框架保存处理了。 然后我们在 BoundField F12 到它的定义

<!-- 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 你到底有多少关系呀!!!

© 著作权归作者所有

共有 人打赏支持
夏至如沫
粉丝 11
博文 37
码字总数 23521
作品 0
郑州
后端工程师
GideView 动态列模板

实际的应用的总是遇到 GrideView 需要动态生成一些数据列,也许是简单的绑定列,更多时候会是特殊的模板列。我们不得不使用代码生成自定义的模板列。其实模板列的概念倒是很简单,通过ASP的前...

夏至如沫 ⋅ 2013/07/02 ⋅ 0

Aspx页面生命周期

页面被请求时,第一个被执行的总是构造函数(constructor). 你可以在这里初始化很多自定义属性或对象。不过这里有一些限制,因为 page 还没有被完全初始化。特别地,你必须使用 HttpContext....

潇风 ⋅ 2012/04/11 ⋅ 0

为 ASP.NET Datagrid 创建自定义列

Marcie Robillard DatagridGirl.com 2003 年 9 月 简介 不得不承认,为 Microsoft® ASP.NET 编写 Datagrid 代码包括大量的重复工作。尽管我深受该控件的困扰,但我还是不断寻找简化这类任务...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

实操利用PowerPoint制作倒计时

褐色记事本封面背景ppt素材  1、新建一个空白板式的ppt,选择合适的模板,输入题目艺术字“倒计时”和“时间到”和相应的文字“时间还剩秒”,调节字体和大小位置。在利用自选图形里的圆角...

ppt模板下载空间 ⋅ 2015/08/29 ⋅ 0

七、ASP.NET之数据绑定控件(二)

数据绑定控件之 Repeater控件 1、Repeater控件的五个模板是: (1)ItemTemplate项模板,每个数据项调用一次 (2)AlternatingItemTemplate交替项模板,每个偶数项调用一次 (3)HeaderTempl...

晓鹉 ⋅ 05/28 ⋅ 0

FineUI v3.3.1 发布了!

关于FineUI 基于 ExtJS 的专业 ASP.NET 控件库。 FineUI的使命 创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序。 支持的浏览器 IE 7.0+、Firef...

三生石上 ⋅ 2013/07/29 ⋅ 4

蝉知 3.0 发布,可定制性最强的企业门户系统!

大家好,我们非常自豪地向大家推出蝉知企业门户3.0版本。该版本实现了区块的跨列布局和模板风格样式的自定义功能,进一步增强了蝉知系统的定制性。加上之前实现的区块布局、模板风格等功能,...

炒蚕豆吃蹦豆 ⋅ 2014/09/26 ⋅ 40

WPF 4 DataGrid 控件(进阶篇一)

上一篇《WPF 4 DataGrid 控件(自定义样式篇)》中,我们掌握了DataGrid 列表头、行表头、行、单元格相关的自定义样式方法,本篇我们继续对自定义样式进行一些高级设置。 DataGridTemplateCo...

junwong ⋅ 2012/03/09 ⋅ 0

Element 2.0.0 正式版发布,带来大量新特性

Element 2.0.0 正式版已发布。Element 是饿了么开源的一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。 新特性 综合 新增 主题 增强...

王练 ⋅ 2017/10/27 ⋅ 10

Element 2.0.0-beta.1 发布,基于 Vue 2.0 的组件库

Element 2.0.0 beta1 已发布,意味着离 2.0 正式版又近了一步。 Element 是饿了么开源的一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速...

王练 ⋅ 2017/10/21 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

监控各项服务

比如有三个服务, 为了减少故障时间,增加监控任务,使用linux的 crontab 实现. 步骤: 1,每个服务写一个ping接口 监控如下内容: 1,HouseServer 是否正常运行,所以需要增加一个ping的接口 ; http...

黄威 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 昨天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部