想不通,请教--在OnLoad里调用Controls.Addat()影响了Dropdownlist的返回值

_Simple 2003-07-21 12:32:28
因为想在每页自动添加一个head控件,所以改写了page的OnLoad事件,然后发现页面上的DropDownlist的返回值出了问题。请高手指点一二。故障现象有点复杂,我试着尽量描述清楚些。
如果页面有个dropdownlist控件,里面的items是在Page_Load()里面添加的,在点击页面的按钮时,这些添加的items能继续保存,并能通过dropdownlist1.SelectedIndex访问它的当前选择项。
可是我修改了OnLoad事件,加了一句语句后,就不正常了,按钮提交后,dropdownlist1的items是空的,selectedindex=-1。如果没有controlsAddAt(1,head)这句,或者改为controlsAdd(head),dropdownlist1就表现正常

代码如下

{
protected System.Web.UI.WebControls.DropDownList DropDownList1;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
if ( !IsPostBack){
this.DropDownList1.Items.Add("aaaa");
this.DropDownList1.Items.Add("bbbb");
}
}
override protected void OnLoad(EventArgs e)
{
base.OnLoad(e);
Web.Controls.Header head=new Web.Controls.Header();
Controls.AddAt(1,head);
}

#region Web Form Designer generated code
这中间的代码就不贴了
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
(DropDownList1.SelectedIndex.ToString());
this.Label1.Text = this.DropDownList1.SelectedIndex.ToString();
}
}
...全文
91 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chnking 2003-07-21
  • 打赏
  • 举报
回复
不是“原因大概是因为onLoad是在LoadVeiwstate过程后调用。”这个原因的
_Simple 2003-07-21
  • 打赏
  • 举报
回复
各位老大,我考虑了saucer的意见,把代码放到page_init中,问题解决了,原因大概是因为onLoad是在LoadVeiwstate过程后调用。
多谢大家!
chnking 2003-07-21
  • 打赏
  • 举报
回复
我也不同意老大的说法,viewstate可以保存DropDownList的item.

问题应该是处在Controls.AddAt(1,head); 中的指定对象添加到集合中的指定索引位置上了,这样可能改变了DropDownList原先在page的控件中的索引,导致恢复viewstate对应的控件不对了.尝试一下将
Web.Controls.Header head=new Web.Controls.Header();
Controls.AddAt(1,head);
放到Page_Init()中看看会不会解决问题.
_Simple 2003-07-21
  • 打赏
  • 举报
回复
cyp503(谁怕?一蓑烟雨任平生):
我也猜想是viewstate出错引起的问题,可是我定义的head控件在form控件之前,应该不会影响form的viewstate吧?
试着吧head.的enableveiwstate设为false,没有效果。
试着吧head控件load到form 里,用这个语句 Controls[1].Controls.AddAt(0,head),在按下按钮后页面报错(见下)。
我的目的是能在每个页面都自动加载head控件,所以定义了个pagebase类,webform都从这个类继承,现在这个方法影响到了页面的viewstate,该怎么解决?

InvalidCastException: 指定的转换无效。]
System.Web.UI.WebControls.WebControl.LoadViewState(Object savedState)
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +125
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +311
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +311
System.Web.UI.Page.LoadPageViewState() +182
System.Web.UI.Page.ProcessRequestMain() +421


saucer(思归, MS .NET MVP)
页面第一次调用当然运行控件的初始化,可是如果是IsPostBack情况下,应该是从viewstate中得到控件信息吧?我想这个问题与Page_Load无关。
saucer 2003-07-21
  • 打赏
  • 举报
回复
如果OnLoad有问题的话,你可以考虑在OnInit里加你的Header
saucer 2003-07-21
  • 打赏
  • 举报
回复
因为是,
if ( !IsPostBack)

只有初始调用时里面的东西才运行


override protected void OnLoad(EventArgs e)
了,
private void Page_Load(object sender, System.EventArgs e)
被调用了么?
cyp503 2003-07-21
  • 打赏
  • 举报
回复
找到一点点参考

当动态生成控件和已有控件并存时 ViewState 的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在 Page_Init 和 Page_Load 事件中读取 ViewState。当页面的控件读取 ViewState 的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被
生成时,页面就会省略掉ViewState或者以剩下或许错误的 ViewState 来填充控件。

所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的 ViewState 通过EnableViewState禁止掉。


详细的可以看看控件生存期

62,046

社区成员

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

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

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

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