日期:2014-05-19  浏览次数:20430 次

事件顺序的问题
主页面中有三个控件
DropDownList1(AutoPostBack=true),
Button1,
一个用户控件


用户控件中只有一个   CheckBox1

运行页面后先改变CheckBox1,然后在点Button1提交,则先发生CheckBox1的事件,然后是Button1.Click事件

如果用DropDownList1提交,则先发生DropDownList1事件,然后才发生CheckBox1的事件


所以我不能在DropDownList1事件中得到CheckBox1的最新值。

怎样让CheckBox1.CheckedChanged事件先执行?

------解决方案--------------------
兄弟,帮你UP。
------解决方案--------------------

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
CheckBox CB = (CheckBox)this.WebUserControl1.FindControl( "CheckBox1 ");
this.Response.Write(CB.Checked.ToString());
}
我取到值了啊!
------解决方案--------------------
所以我不能在DropDownList1事件中得到CheckBox1的最新值。

怎样让CheckBox1.CheckedChanged事件先执行?
————————————————————————————————————————

现实是,页面子控件事件的这些先后次序是不确定的。尽管确实有顺序,但是这个地方去硬搞什么顺序就是太勉强了。你的设计应该基于你稍微周全一点的逻辑知识来组织。你应该分别列出:如果DropDownList单独改变的时候如何影响业务呢?如果CheckBox单独改变的时候如何影响业务呢?

举个例子吧:假设CheckBox用来选择“男/女”, DropDownList用来选择省份,这两个一旦修改就更新页面上某个控件“在线用户列表”,但是如果不修改则不更新,那么程序这样写:


bool 更新在线列表=false;

void CheckBox_Changed(....)
{
更新在线列表=true;
}

void DropDownList_SelectedChanged(...)
{
更新在线列表=true;
}

void page_PreRender(....)
{
if(更新在线列表)
{
在线列表控件.性别=CheckBox1.Checked;
在线列表控件.省份=DropDownList1.SelectedValue;
}
}

总之,设计流程勉强、硬要规定先后次序,要顺着你所依赖的这个系统架构的流程来设计。


------解决方案--------------------
lz

如果你不让CheckBox1使用AUTOPOSTBACK
那就不要用 CheckBox1.CheckedChanged事件~
你用其他事件发生POSTBACK 这时候 CheckBox1.CheckedChanged事件实际是不存在的.
服务端虽然能得到值的改变,但是对象和参数都不正确.你在事件处理上肯定会有问题.

应该按照动作来处理,按照 sp1234 说的作