丢失的控件信息

连续两天搞这个东西,起因是devexpress里的dataview控件,把它包装成一个user control以后,却发现在postback回来后丢失了用户记录的内容,无论是里面的textbox还是dropdownlist。都如此。

第一步,怀疑是update panel的问题,因为之前刚把update panel的ChildrenAsTrigger设成false,后来发现这样做除了要手动在每个postback处理函数里加上UpdatePanel.update()外,没什么本质区别。而且update只能用一次,后面那次失效而不是前面的失效。所以并没有起到限制更新的作用。那我何必呢。

第二步,排除了update panel的原因,认为是viewstate的问题,可是每个开关都设成了enableViewState=true都没有用。遂怀疑是不是它,何况似乎我以前viewstate[]是用来存放不跨页面的变量的,从来不需要用来保持控件状态。一查果然如此,asp.net可以直接从request里读到form提交上来时候的用户记录的控件值。毕竟,textbox和

dropdownlist都是<input>嘛。

第三步,开始走到另一条路上,debug到SaveTextViewState 这个属性,很奇怪dataview里的控件的该属性都是false,而正常的页面控件的该属性都是true。一google确实很多人碰到这个疑问,还有到mono里找源代码解惑的人。可惜,就算我把控件事件给响应了,这个值变成了true,还是不行。。。看来控件的用户信息确实不从viewstate里取啊。或者是可能从viewstate里取,但是我仍然要显式地写到viewstate里。不知道了。

第四步,走到了composite control的方向,参考使用了

override protected void OnInit(EventArgs e)
{
this.EnsureChildControls();
}

结果也是没用,最后还是从第二步里忽然想到,能不能自己从request里取,虽然有些土,觉得这应该是asp.net框架干的。但是it works!

 

 

referenece:

http://epasser.aydc.com.cn/article/adp/2/content11225.html

http://www.cnblogs.com/king_astar/archive/2004/09/30/48126.html

http://blogs.telerik.com/blogs/dimitar_kapitanov/archive/2006/01/17/89.aspx

http://lists.ximian.com/pipermail/mono-patches/2003-June/020098.html2007

New和Override的区别

忽然发现,这么基础的问题原来我不懂啊。。。

new即什么都不写直接覆盖,但是并不是最强制的下层覆盖上层,不像override可以聪明地找到对象所在的层。

忽然想到,如果我多加几层,采用virtual-new-override-new的形式,类似连接中的例子,只是数组改为第二层的类型,而一个第四层的元素的describe方法会调用哪一层的方法呢?肯定不是第四层,因为new不会识别该对象的层数到第四层,问题是直接调用第二层的方法呢?还是多少受第三层的override影响呢?有空的时候可以试一下。谁知道告诉我。

http://msdn2.microsoft.com/en-us/library/ms173153(VS.90).aspx