读者问与答

原发问问题

章老师你好,我目前有个有关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

 

posted on 2007-07-17 14:22  章立民研究室  阅读(9915)  评论(1编辑  收藏  举报

导航