动态向页面加入一个下拉框:protected void Page_Load(object sender,EventArgs e)
{
DropDownList ddl=new DropDownList ();
if (!IsPostBack) //页面第一次加载时初始化值
{
ddl.Items.Add("test1");
ddl.Items.Add("test2");
}
Form.Controls.Add(ddl); //加入表单控件树
}
然后在页面上加入一个按钮,启动页面后点击按钮,发现下拉框中的选项都消失了。但是如果加入表单控件树的代码之前就不会发生这样的问题:
protected void Page_Load(object sender,EventArgs e)
{
DropDownList ddl=new DropDownList ();
Form.Controls.Add(ddl); //加入表单控件树
if (!IsPostBack) //页面第一次加载时初始化值
{
ddl.Items.Add("test1");
ddl.Items.Add("test2");
}
}
书上说,”这是因为一旦控件被加入了页面控件树,TrackViewState()方法就会自动调用来维护控件的视图状态(这样,控件的初始化数据就能保存下来),因此,只有把初始化控件的语句放到加入表单控件树的语句之后,下拉列表框中的数据才能保留。“可我奇怪,放在之前和之后有神马区别?回发时,Form.Controls.Add(ddl); 总是要执行的,而 if (!IsPostBack) 语句块总是不会执行的,但为嘛结果就有区别呢?
{
DropDownList ddl=new DropDownList ();
if (!IsPostBack) //页面第一次加载时初始化值
{
ddl.Items.Add("test1");
ddl.Items.Add("test2");
}
Form.Controls.Add(ddl); //加入表单控件树
}
然后在页面上加入一个按钮,启动页面后点击按钮,发现下拉框中的选项都消失了。但是如果加入表单控件树的代码之前就不会发生这样的问题:
protected void Page_Load(object sender,EventArgs e)
{
DropDownList ddl=new DropDownList ();
Form.Controls.Add(ddl); //加入表单控件树
if (!IsPostBack) //页面第一次加载时初始化值
{
ddl.Items.Add("test1");
ddl.Items.Add("test2");
}
}
书上说,”这是因为一旦控件被加入了页面控件树,TrackViewState()方法就会自动调用来维护控件的视图状态(这样,控件的初始化数据就能保存下来),因此,只有把初始化控件的语句放到加入表单控件树的语句之后,下拉列表框中的数据才能保留。“可我奇怪,放在之前和之后有神马区别?回发时,Form.Controls.Add(ddl); 总是要执行的,而 if (!IsPostBack) 语句块总是不会执行的,但为嘛结果就有区别呢?
解决方案 »
- 怎样将特大图片象地图一样显示(如google map, ms virtualearth),要用ajax
- asp.net 一个ajax 问题
- 有做过工作流的朋友吗?可以给提供简单网上的例子吗?最好能提供数据结构,谢谢
- 新手问题:access登陆问题
- ASP.NET中checkbox獲取gridview中選擇的值的相關問題
- 求一个XSL 在线等
- 在 Web.config 里面配置 连接ACCESS 数据库 为什么不能用相对路径??
- ASP.NET下载功能
- 请问CSDN的论坛主贴数据是怎么绑定的??
- 现在国内有哪个站是用asp.net做的
- 很爽,用了一周时间在Linux就学会了一门新的编程语言vala叽哩哇啦
- 求助:asp.net,C#,中,GridView没有更新的问题,添加有更新,删除没有更新,但数据有删除
楼主的问题是
Form.Controls.Add(ddl); //加入表单控件树
这句话在一个条件判断的前后为什么有区别,而这个条件判断又明确是不会执行的,仅仅因为判断了一下就改变状态,这个副作用有点大,我也疑惑,等高人。
Form.Controls.Add(ddl); //加入表单控件树
这句话在一个条件判断的前后为什么有区别,而这个条件判断又明确是不会执行的,仅仅因为判断了一下就改变状态,这个副作用有点大,我也疑惑,等高人。
你每次刷新页面就对ddl进行了重新实例!!
而赋值的过程只在第一次的加载时生成的那个ddl实例进行了赋值!!
每次刷新又重新生成了一个新的dll,而你却要求对它有值?
不要去研究什么viewstate,什么页面状态
这根本不是深层技术的疑问,是楼主编程思维的问题!!修改:
直接将ddl的实例,赋值和添加到容器的过程放到!IsPostBack内
做过测试吗?放到!IsPostBack,怕是连下拉框都要在递交后消失了吧
而且楼主的问题不是要如何解决,而是为什么一句话在一个条件判断为假的语句块前后执行会有区别。
但是在实际的程序开发中,你这样的开发方式是不可取的
说为何会有值的差异,可以用引用类型和内存存储的理念来解释
当第一次实例出DDL,在内存中开辟空间将Item的值保存到内存中
并指向这个DDL实例
当刷新回发页面时,实例出第二个DDL并将Item的值指向到第一次
实例出来的DDL地址,至于为什么指向第一次实例地址
这就是ViewState保存页面数据的特点同样这些数据也是存放在内存中的
产生差异,最重要的原因可能是IsPostback对页面初始化的控制,或许
是对页面属性从ViewState中读取和清空的或者是内存指定的一些操作
问题就是在这里呀,唯一的区别就是一个执行了IsPostback判断,一个没有,但是一个属性的读取怎么可能会对状态产生如此大的影响?这样的设计是不是有问题?IsPostback到底是如何实现的,现在疑惑的就是这些问题,继续等高人解答