关于WebForm,十分惭愧(下)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
HtmlGenericControl div = new HtmlGenericControl("div");
div.ID = "divTest";
HtmlGenericControl div2 = new HtmlGenericControl("div");
div2.ID = "divTest2";
RadioButtonList radio = new RadioButtonList();
radio.ID = "radioTest";
radio.DataSource = new List<string>() { "aaa2", "bbb2" };
radio.DataBind();
TextBox text = new TextBox();
text.ID = "textDollers";
div.Controls.Add(radio);
div2.Controls.Add(text);
divRun.Controls.Add(div2);
divRun.Controls.Add(div);
这次我们修改下Reload中的代码,在radio加入div前,绑定新数据源,在Refresh后Gestring,我们发现radios呈现的依旧是aaa,bbb两项。
这次的原因和没有Track无关,是因为raido控件的LoadViewState覆盖了你的数据。我可要小心这个问题了。
为什么我的Reload要在LoadViewState中执行呢?据说这是MSDN推荐的,他真的好吗?试着再次修改Reload代码,把aaa2,bbb2的绑定放到最底端,添加到控件树之后。结果发现绑定新数据依旧无效,为什么呢?此时虽然base.LoadViewState执行了,但我猜想此时divRun的状态还在LoadViewState之前,在为添加到其的控件进行周期追赶时,可能并不会执行相应的LoadViewState,要等整个的LoadViewState步骤跳出去,也就是说我们在最后执行的绑定还是被覆盖了。试着把Reload方法放到Page_Load中执行,发现新数据在回发后,呈现在页面上了。
啊,暂时想不起来什么新的测试了。可能下一步在开发中会涉及到很多LiteralControl,也许会有新发现。
后续
写完此篇文章后我又读了一点资料,做了一个试验:在divRun中添加一个dropdownlist,在page_load中绑定数据,在Refresh中将radio控件添加在此dropdownlist之前,但Reload中顺序不变,即第一页面加载是 dropdownlist,Refresh后虽然变成了radio,drop, text,但此时dropdownlist view state数据已经加载完,所以依旧能看到drop绑定的数据,(填写textbox).第三次GetString后,顺序变成了drop,text,radio,直接影响了view state 的装载,结果是drop和radio无数据,但text之前填写的数据还保存完好。我此时有两个疑问,第一是为什么顺序改变了,并没有之前的报黄页而是没加载成数据而已,第二是为什么text是好的,难道和post数据有关?当我再次试验,在Refresh中,为TextBox添加text.Font.Bold = true;后,在GetString直接黄页。
不理解,看来要等下一步去调试源码才能知道了。
还有,文章中提出加载动态控件最好在Init步骤,理由是这样可以打乱顺序,在我的业务逻辑中,因为不存在静态空间在中间的情况所以无所谓。但我猜测即使Init中顺序也不能随意打乱的吧?我上面的错误放在Init中就没事了?由于Init中还没有viewstate数据,页面状态没法判断,所以测试比较麻烦,而且我实际开发中也遇不上。