一个百思不得其解的奇怪问题,求教

udnova 2011-09-30 02:49:39
动态向页面加入一个下拉框:

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) 语句块总是不会执行的,但为嘛结果就有区别呢?

...全文
275 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
udnova 2011-09-30
  • 打赏
  • 举报
回复
自己找到答案了,谢谢大家的帮助,感谢金老师:http://blog.csdn.net/bitfan/article/details/2504743
zhaoyycit 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 hztltgg 的回复:]
引用 18 楼 zhaoyycit 的回复:
LZ对IsPostBack或者说对编程理解不够啊
你每次刷新页面就对ddl进行了重新实例!!
而赋值的过程只在第一次的加载时生成的那个ddl实例进行了赋值!!
每次刷新又重新生成了一个新的dll,而你却要求对它有值?
不要去研究什么viewstate,什么页面状态
这根本不是深层技术的疑问,是楼主编程思维的问题!!

修改:
直接将d……
[/Quote]

确实,我没有做过测试,这样写确实是有问题。我的错~~
hztltgg 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zhaoyycit 的回复:]
最重要的原因可能是IsPostback对页面初始化的控制,
[/Quote]

问题就是在这里呀,唯一的区别就是一个执行了IsPostback判断,一个没有,但是一个属性的读取怎么可能会对状态产生如此大的影响?这样的设计是不是有问题?IsPostback到底是如何实现的,现在疑惑的就是这些问题,继续等高人解答
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
继续求详细解答,头还是晕的。。。。
天二天 2011-09-30
  • 打赏
  • 举报
回复
我晕。下拉框的值当然会没有了。 点击按钮后又到page_load方法, 但不会运行!IsPostBack 里面的语句。只有在页面第一次加载时才进入!IsPostBack .
zhaoyycit 2011-09-30
  • 打赏
  • 举报
回复
楼主这样的疑问是不错,可以对ViewState保存数据的过程有所了解
但是在实际的程序开发中,你这样的开发方式是不可取的
说为何会有值的差异,可以用引用类型和内存存储的理念来解释
当第一次实例出DDL,在内存中开辟空间将Item的值保存到内存中
并指向这个DDL实例
当刷新回发页面时,实例出第二个DDL并将Item的值指向到第一次
实例出来的DDL地址,至于为什么指向第一次实例地址
这就是ViewState保存页面数据的特点同样这些数据也是存放在内存中的
产生差异,最重要的原因可能是IsPostback对页面初始化的控制,或许
是对页面属性从ViewState中读取和清空的或者是内存指定的一些操作
hztltgg 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhaoyycit 的回复:]
LZ对IsPostBack或者说对编程理解不够啊
你每次刷新页面就对ddl进行了重新实例!!
而赋值的过程只在第一次的加载时生成的那个ddl实例进行了赋值!!
每次刷新又重新生成了一个新的dll,而你却要求对它有值?
不要去研究什么viewstate,什么页面状态
这根本不是深层技术的疑问,是楼主编程思维的问题!!

修改:
直接将ddl的实例,赋值和添加到容器的过程放到!IsPo……
[/Quote]

做过测试吗?放到!IsPostBack,怕是连下拉框都要在递交后消失了吧
而且楼主的问题不是要如何解决,而是为什么一句话在一个条件判断为假的语句块前后执行会有区别。
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
继续等....
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
楼上的还没理解楼主的意思,请再仔细看下问题描述!!
zhaoyycit 2011-09-30
  • 打赏
  • 举报
回复
LZ对IsPostBack或者说对编程理解不够啊
你每次刷新页面就对ddl进行了重新实例!!
而赋值的过程只在第一次的加载时生成的那个ddl实例进行了赋值!!
每次刷新又重新生成了一个新的dll,而你却要求对它有值?
不要去研究什么viewstate,什么页面状态
这根本不是深层技术的疑问,是楼主编程思维的问题!!

修改:
直接将ddl的实例,赋值和添加到容器的过程放到!IsPostBack内
CalvinR 2011-09-30
  • 打赏
  • 举报
回复
学习观摩之中
belldandy11 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hztltgg 的回复:]
想不通。。等高手!
[/Quote]
++
hztltgg 2011-09-30
  • 打赏
  • 举报
回复
想不通。。等高手!
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
想不通。。等高手!
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
等高人解答
nbgcqlk 2011-09-30
  • 打赏
  • 举报
回复
头也晕了。。等高人解答!
chen_ya_ping 2011-09-30
  • 打赏
  • 举报
回复
动态控件最扯淡。
licai1210 2011-09-30
  • 打赏
  • 举报
回复
放在后面压根就不会将数据保存到viewstate里面
  • 打赏
  • 举报
回复
同样不懂。。。。
WangxiaoluWang 2011-09-30
  • 打赏
  • 举报
回复
您这到底是CS的还是BS的,怎么又是IsPostBack,又是Form的?
加载更多回复(6)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧