讀者問與答

原發問問題

章老師你好,我目前有個有關 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所示。
<!--[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
相關文章
相關標籤/搜索