解答
親愛的
Cody
讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆以下:
圖表1
圖表2
圖表1與圖表2所示者是網頁範例的執行畫面,這是一個以Web服務看成數據來源(Data Source),結合 FormView 控件來新增數據的接口,基本上,當用戶按下 FormView 控件上的「加入」按鈕以後,就會呼叫 Web 服務的方法,將 FormView 上全部字段的數據寫入一個 XML 文件。
圖表3
圖表4
值得注意的是,如圖表3與圖表4所示,用戶第一次按下按鈕以後,網頁範例會馬上顯示一個 UpdateProgress 控件,以提示用戶「正在寫入資料中,請稍候…」的訊息,待成功寫入數據以後,本來的 UpdateProgress 控件會隱藏起來,並顯示一個「已成功新增數據」的訊息,而當用戶第二次以後按下按鈕時,網頁範例會立刻將剛剛的成功訊息隱藏,並接續以後的數據寫入動做,成功寫入數據的結果如圖表5所示。
<!--[if !supportLineBreakNewLine]-->
圖表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』。