用编程的方法控制UpdatePanel,先看一个例子,通过ScriptManager的RegisterAsyncPostBackControl()方法注册一个异步提交的控件:
protected void Page_Load(object sender, EventArgs e)
{
sm1.RegisterAsyncPostBackControl(btnTest);
}
protected void btnTest_Click(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString();
}
注意,btnTest并没有在UpdatePanel里,而是通过代码里的RegisterAsyncPostBackControl注册地。
再注意,在CLICK事件里只有一句lblTime.Text=.....,而且,UpdatePanel 没有设置UpdateMode,这是我无意之间忘了,没想到效果竟然也对,原例中是这样的
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
void Button1_Click(object sender, EventArgs e)
{
this.Label2.Text = DateTime.Now.ToString();
this.UpdatePanel1.Update();
}
设置了UpdateMode="Conditional",Update方法才管用,两者都设置,程序才能正常运行,为什么?
UpdatePanel还可以嵌套使用,即在一个UpdatePanel的ContentTemplate中还可以放入另一个UpdatePanel。当最外面的UpdatePanel被触发更新时,它里面的子UpdatePanel也随着更新,里面的UpdatePanel触发更新时,只更新它自己,而不会更新外层的UpdatePanel,例子太简单了,不用写了。
同一页面上使用多个UpdatePanel
由于UpdatePanel默认的UpdateMode是Always,如果页面上有一个局部更新被触发,则所有的UpdatePanel都将更新,这是我们不愿看到的,我们只需要UpdatePanel在它自己的触发器触发的时候更新就可以了,所以需要把UpdateMode设置为Conditional。
例子很长,就不粘过来了,核心的地方有以下几点:
1、
2、每个UpdatePanel的UpdateMode="Conditional"
3、因为触发服务器事件的控件可能全在其中一个UpdatePanel中,所以,在需要的地方(其它UpdatePanel)使用Triggers来指定当前的UpdatePanel由哪个控件激发。
OK,今天就到这了,感谢TerryLee的教程。