当前位置:  开发笔记 > 后端 > 正文

如何配置GridView CommandField以在UpdatePanel中触发整页更新

如何解决《如何配置GridViewCommandField以在UpdatePanel中触发整页更新》经验,为你挑选了1个好方法。

我的页面上有2个用户控件.一个用于搜索,另一个用于编辑(以及其他一些东西).

提供搜索功能的用户控件使用GridView显示搜索结果.这个GridView有一个用于编辑的CommandField(showEditButton ="true").

我想将GridView放入UpdatePanel,以便通过搜索结果进行分页是顺利的.

问题是,当用户单击编辑链接(CommandField)时,我需要执行整页回发,以便可以隐藏搜索用户控件并显示编辑用户控件.

编辑:我需要进行整页回发的原因是因为编辑用户控件在我的GridView所在的UpdatePanel之外.它不仅在UpdatePanel之外,而且在一个完全不同的用户控件中.

我不知道如何将CommandField作为整页回发触发器添加到UpdatePanel.PostBackTrigger(用于指示控件导致整页回发)将ControlID作为参数; 但是CommandButton没有ID ......你可以看出为什么我遇到这个问题.

更新我试图解决问题的其他方法: 我采用了一种新方法来解决问题.

在我的新方法中,我使用了TemplateField而不是CommandField.我在TemplateField中放置了一个LinkBut​​ton控件并为其命名.在GridView的RowDataBound事件期间,我检索了LinkBut​​ton控件并将其添加到UpdatePanel的触发器中.

这是UpdatePanel和GridView的ASP标记


  
    
      
        
          
          
            
          
        
        
    
  

在我的VB.NET代码中.我实现了一个处理GridView的RowDataBound事件的函数.在这个方法中,我找到了绑定行的LinkBut​​ton,为LinkBut​​ton创建一个PostBackTrigger,并将其添加到UpdatePanel的触发器.这意味着为GridView 编辑中的每个"编辑"LinkBut​​ton创建了一个PostBackTrigger :这并没有为每个"编辑"LinkBut​​ton创建一个PostBackTrigger,因为GridView中的所有LinkBut​​ton的ID都是相同的.

Private Sub SearchResultsGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles SearchResultsGrod.RowDataBound
    If e.Row.RowType = DataControlRowType.Header Then
       ''I am doing stuff here that does not pertain to the problem
    Else
        Dim editLink As LinkButton = CType(e.Row.FindControl("Edit"), LinkButton)
        If editLink IsNot Nothing Then
            Dim fullPageTrigger As New PostBackTrigger
            fullPageTrigger.ControlID = editLink.ID
            SearchResultsUpdateSection.Triggers.Add(fullPageTrigger)
        End If

    End If
End Sub

而不是处理GridView的RowEditing事件进行编辑,而是使用RowCommand.

Private Sub SearchResultsGrid_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles SearchResultsGrid.RowCommand
        RaiseEvent EditRecord(Me, New EventArgs())
End Sub

这种新方法根本不起作用,因为GridView中的所有LinkBut​​ton都具有相同的ID.

在阅读UpdatePanel.Triggers属性上的MSDN文章后,我的印象是触发器只能以声明方式定义.这意味着我在VB代码中所做的任何事都行不通.

任何建议将不胜感激.

谢谢,

-Frinny



1> sepho..:

要将控件注册为回发的触发器,请使用ScriptManager的RegisterPostBackControl方法.

     If editLink IsNot Nothing Then
           ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(editLink )
        End If

此方法也适用于在其他控件中动态添加的控件.我的GridView遇到了同样的问题.我已经注册了TemplatedField行的linkBut​​ton和imageButton.

我使用RowCreated Gridview的处理程序而不是RowDataBound处理程序:RowCreated专注于解析Gridview行的定义并创建Gridview行的控件结构,RowDataBound专注于绑定数据到RowCreated中创建的行控件.此外,在init和postback情况下都会自动调用RowCreated,但RowDataBound仅在调用DataBind时调用.码


        
               
                
                     Border
                        ToolTip="View Pdf Document" />
                    <%#Eval("ContactName")%>
                
            
        
    




    protected void ContactsGridView_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //Register download buttons as PostBack controls  (instead of AsyncPostback because of their updatepanel container))
            ImageButton ib = (ImageButton)e.Row.FindControl("PreviewImageButton");
            if (ib != null) ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(ib);
            LinkButton lb = (LinkButton)e.Row.FindControl("ContactNamePreviewLinkButton");
            if (lb != null) ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(lb);
        }

    }
    protected void ContactsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "PreviewContact")
        {

            _presenter.OnPreviewContactClicked((string)e.CommandArgument);
        }
    }

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有