【问题标题】:ASP.NET LinkButton in GridView causing full postbackGridView 中的 ASP.NET LinkBut​​ton 导致完全回发
【发布时间】:2014-12-02 21:47:28
【问题描述】:

这个真的把我逼疯了。我已经阅读并尝试了大多数解决方法,但它仍然会发回!!

所有标记都是从代码隐藏动态生成的,并从 init 事件插入到作为母版页一部分的页面中。

有一系列嵌套的标签,标签内容大部分是GridView中的数据。每个 Gridview 都设置在它自己的更新面板中。每次单击 GridView 中的 LinkBut​​ton 时,都会有一个完整的回发导致选项卡重置(GridView 之外和 UpdatePanel 中的任何按钮都不会导致完整的回发。

LinkBut​​tons 是这样生成的

 Dim Select_Field As New CommandField
        With Select_Field
            .HeaderText = "View Transactions"
            .SelectText = "View Transactions"
            .ShowSelectButton = True
        End With
        GV.Columns.Add(Select_Field)

向 ToolKitScriptManager 注册

Private Sub AssessmentsMain_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    Try
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim vID As Integer = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "ID"))
            Dim LB As LinkButton = CType(e.Row.Cells(4).Controls(0), LinkButton)
            LB.ID = "AssMain_" & vID
            AjaxControlToolkit.ToolkitScriptManager.GetCurrent(Me).RegisterAsyncPostBackControl(LB)
        End If
    Catch ex As Exception
        Dim vError As New SendError
        vError.MailError("840", PageName, ex)
        ShowError()
    End Try
End Sub

一行生成的标记是这样的

<tr class="GridView" style="color:#333333;background-color:#F7F6F3;">
<td>10</td>
<td>Adam White</td>
<td>4224 Res Road</td>
<td align="right">$6,850.65</td>
<td>
<a id="ctl00_ContentPlaceHolder1_AssessmentsMainGV_ctl02_AssMain_10"  href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$AssessmentsMainGV&#39;,&#39;Select$0&#39;)" style="color:#333333;">View Transactions</a>

GridView 类

Public Class HAS_Gridview
    Inherits GridView
    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)
        CellPadding = 4
        GridLines = WebControls.GridLines.None
        ForeColor = Drawing.ColorTranslator.FromHtml("#333333")
        ClientIDMode = UI.ClientIDMode.AutoID
        With MyBase.FooterStyle
            .BackColor = Drawing.ColorTranslator.FromHtml("#E2DED6")
            .Font.Bold = True
            .ForeColor = Color.White
        End With
        RowStyle.BackColor = Drawing.ColorTranslator.FromHtml("#F7F6F3")
        RowStyle.ForeColor = Drawing.ColorTranslator.FromHtml("#333333")
        PagerStyle.HorizontalAlign = WebControls.HorizontalAlign.Center
        PagerStyle.ForeColor = Color.Black
        PagerStyle.BackColor = Drawing.ColorTranslator.FromHtml("#E2DED6")
        With MyBase.SelectedRowStyle
            .BackColor = Drawing.ColorTranslator.FromHtml("#E2DED6")
            .Font.Bold = True
            .ForeColor = Drawing.ColorTranslator.FromHtml("#333333")
        End With
        With MyBase.HeaderStyle
            .BackColor = Drawing.ColorTranslator.FromHtml("#E2DED6")
            .Font.Bold = True
            .ForeColor = Color.Black
            .CssClass = "GridView"
        End With
        EditRowStyle.BackColor = Drawing.ColorTranslator.FromHtml("#999999")
        With MyBase.AlternatingRowStyle
            .BackColor = Color.White
            .ForeColor = Drawing.ColorTranslator.FromHtml("#284775")
            .CssClass = "GridView"
        End With
        With MyBase.RowStyle
            .CssClass = "GridView"
        End With
    End Sub

End Class

【问题讨论】:

    标签: asp.net gridview ajaxcontroltoolkit linkbutton


    【解决方案1】:

    您是否尝试过以编程方式添加触发器而不是在 AjaxControlToolkit 中注册:

    Dim trigger As New AsyncPostBackTrigger()
    trigger.ControlID = LB.ID
    trigger.EventName = "Click"
    MyUpdatePanel.Triggers.Add(trigger)
    

    【讨论】:

    • 是的 - 也试过了 - 除非从 Load Complete 运行,否则它会因为无法找到控件而爆炸 - 然后它就不起作用了
    【解决方案2】:

    回发似乎是由为锚标记生成的标记中的href="javascript:__doPostBack(&amp;#39;ctl00$ContentPlaceHolder1$AssessmentsMainGV&amp;#39;,&amp;#39;Select$0&amp;#39;)" 引起的。

    尝试定义自己的 _doPostBack。

    如果您还没有检查过post a 和post b,他们提供了几种方法来做到这一点。

    【讨论】:

      【解决方案3】:

      最后,我可以让它工作的唯一方法是

      为 LinkBut​​ton 模板创建一个类

      Public Class LinkButtonTemplate
          Implements ITemplate
          Private m_ColumnName As String
          Event LinkButtonItem_Clicked(sender As LinkButton, e As EventArgs)
          Public Property ColumnName() As String
              Get
                  Return m_ColumnName
              End Get
              Set(ByVal value As String)
                  m_ColumnName = value
              End Set
          End Property
          Public Sub New()
          End Sub
          Public Sub New(ByVal ColumnName As String)
              Me.ColumnName = ColumnName
          End Sub
          Public Sub InstantiateIn(container As Control) Implements ITemplate.InstantiateIn
              Dim LB As New LinkButton()
              With LB
                  .ID = "LB_" & ColumnName
                  .Text = ColumnName
                  .OnClientClick = "LinkButtonClick(this);"
             End With
            container.Controls.Add(LB)
          End Sub
       End Class
      

      添加此 javascript,以便将 ID 发布到隐藏字段并单击隐藏按钮

      Private Sub LoadLinkButtonClick()
          Try
              Dim SB As New StringBuilder
              SB.Append("function LinkButtonClick(LinkButton){ ")
              SB.Append("setTimeout(function() { ")
              SB.Append("$get('" & GridViewLBClicked.ClientID & "').click(); ")
              SB.Append(" }, 300); ")
              SB.Append("var sendingID = LinkButton.id; ")
              SB.Append("document.getElementById('" & HiddenField1.ClientID & "').value = sendingID; ")
              SB.Append("} ")
              ScriptManager.RegisterStartupScript(Me, Me.GetType(), "LoadLinkButton", SB.ToString, True)
          Catch ex As Exception
              Dim vError As New SendError
              vError.MailError("1229", PageName, ex)
          End Try
      End Sub
      

      在 RowDataBound 事件上捕获我们需要的 ID 并将其添加到 LinkBut​​ton ID(所以现在我们知道发送的 GridView 和选定的行)

      Private Sub AssessmentsMain_RowDataBound(sender As Object, e As GridViewRowEventArgs)
          Try
              If e.Row.RowType = DataControlRowType.DataRow Then
                  Dim vID As Integer = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "ID"))
                  Dim LB As LinkButton = CType(e.Row.Cells(4).Controls(0), LinkButton)
                  LB.ID = "AssMain_" & vID
              End If
          Catch ex As Exception
              Dim vError As New SendError
              vError.MailError("840", PageName, ex)
              ShowError()
          End Try
      End Sub
      

      点击隐藏按钮,我们可以恢复进行异步回发所需的所有数据

      Private Sub RaiseLinkButton_Click(sender As Object, e As EventArgs)
          Try
              Dim vFunction As New Functions
              Dim vValue As String = HiddenField1.Value
              Dim vSplit = vValue.Split("_")
              Dim i As Integer = 0
              For Count As Integer = 0 To vSplit.Length - 1
                  i += 1
              Next
              Dim DGName As String = vSplit(i - 2)
              Select Case DGName
                  Case "AssMain"
                      Dim MV As MultiView = vFunction.FindControlRecursive(BodyMain, "AssessmentMultiView")
                      Dim GV As CustomControl.HAS_Gridview = vFunction.FindControlRecursive(BodyMain, "AssessmentDetailGV") 
                      With GV
                          .DataSource = AssessmentsDetail_ReturnDataSet()
                          .DataBind()
                          .PageIndex = 0
                      End With
      
                      MV.ActiveViewIndex = 1
      
                      Dim vPanel As UpdatePanel = vFunction.FindControlRecursive(BodyMain, "AssessmentUpdatePanel")
                      vPanel.Update()
      
      
              End Select
      
          Catch ex As Exception
              Dim vError As New SendError
              vError.MailError("953", PageName, ex)
              ShowError()
          End Try
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2011-08-04
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2013-07-02
        相关资源
        最近更新 更多