读者问与答
原发问问题
章老师你好,我目前有个有关UpdateProgress的小问题想请教您~~~在我的程序画面中,有个用来显示讯息的Label,旁边亦放置了一个UpdateProgress,当我按「新增数据」按钮,UpdateProgress
会显示请用户稍候的讯息,但是当这个UpdateProgress在显示数据的时候,它外面的那个Label讯息会显示前一个动作留下的讯息,例如,我第一次新增完数据后讯息列会显示「数据已成功新增」的讯息,但是第二次执行新增时,画面的updateprogress跟它外面的Label会一起出现耶,所以~~~请问老师有没有方法能在updateprogress显示讯息的那段期间将外面显示讯息的Label先隐藏掉,等updateprogress消失时再把Label显示出来呢?
解答
亲爱的Cody读者您好,很感谢您对于章立民研究室的支持,有关于您提到的问题,回复如下:
图表1
图表2
图表1与图表2所示者是网页范例的执行画面,这是一个以Web服务当作数据来源(Data Source),结合 FormView 控件来新增数据的接口,基本上,当用户按下 FormView 控件上的「加入」按钮之后,就会呼叫 Web 服务的方法,将 FormView 上所有字段的数据写入一个 XML 文件。
图表3
图表4
值得注意的是,如图表3与图表4所示,用户第一次按下按钮之后,网页范例会立刻显示一个 UpdateProgress 控件,以提示用户「正在写入资料中,请稍候…」的讯息,待成功写入数据之后,原本的 UpdateProgress 控件会隐藏起来,并显示一个「已成功新增数据」的讯息,而当用户第二次之后按下按钮时,网页范例会马上将刚刚的成功讯息隐藏,并接续之后的数据写入动作,成功写入数据的结果如图表5所示。
图表5
图表6
网页范例的设计画面如图表6所示,从图表中可以发现,刚刚显示「已成功新增数据」的讯息的控件是一个 Label 控件,而该控件之所以能够在网页范例成功写入数据之后显示讯息的原因,是因为我们在网页范例的类别加入一个用来判断处理结果的属性,并且分别在ObjectDataSource1数据来源Inserted事件的事件处理例程,以及FormView1控件PreRender事件的事件处理例程中,判断该属性所代表的布尔值,以便能够正确显示或隐藏 Label 控件,兹将程序代码摘要列示如下:
Partial Class
DemoForm001
Inherits System.Web.UI.Page
Protected Property
InsertCompleteOrNot() As Boolean
Get
If ViewState("InsertCompleteOrNot")
IsNot Nothing Then
Return
ViewState("InsertCompleteOrNot")
Else
Return
False
End
If
End Get
Set(ByVal Value As Boolean)
ViewState("InsertCompleteOrNot")
= Value
End Set
End Property
…
Protected Sub FormView1_PreRender(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles FormView1.PreRender
Dim myFormView
As FormView
= CType(sender, FormView)
Dim myLabel
As Label
= CType(myFormView.FindControl("Label6"),
Label)
If Me.InsertCompleteOrNot
Then
myLabel.Text = "已成功新增资料"
myLabel.Visible
= True
Else
myLabel.Text = ""
myLabel.Visible
= False
End If
Me.InsertCompleteOrNot = False
End Sub
Protected Sub ObjectDataSource1_Inserted(ByVal sender As Object, ByVal e As _
System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs)
_
Handles ObjectDataSource1.Inserted
If e.AffectedRows = 0 Then
Me.InsertCompleteOrNot = False
Else
Me.InsertCompleteOrNot = True
End If
End Sub
End Class
为了让第二次之后的异步回传在执行之前,能够将 FormView 控件所显示的处理成功讯息隐藏起来,请替 PageRequestManager 对象的 initializeRequest 事件撰写一个 JavaScript 事件处理例程,以便取得 FormView 控件显示成功讯息的 Label 控件,并修改该控件的 CSS 属性设定来隐藏它:
<script type="text/javascript" language="javascript">
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(hideLabel);
function hideLabel()
{
var label = $get("FormView1_Label6");
if(label)
{
label.style.visibility = "hidden";
}
return true;
}
</script>
欲详细了解 PageRequestManager 对象,请阅读「ASP.NET AJAX 经典范例 100/使用 VB」一书的第 5 章 - 『悠游于异步之间,探索 PageRequestManager』。