【问题标题】:Button click not behaving the same as page load按钮单击与页面加载的行为不同
【发布时间】:2021-06-21 09:13:36
【问题描述】:

情况:

我有一个主要工作的 aspx 页面,其中包含一个 asp:GridView 和一个 asp:TextBox,使用 asp:RangeValidator 来管理 gridview 的页面大小。我还有两个 asp:LinkBut​​ton 来分别增加和减少大小。在代码隐藏中,我使用数据表作为 gridview 的数据源。

在第一次将多行填充到 gridview 之后,我可以更新 rowcount 文本框,按 Enter 键会导致 gridview 显示新的页面大小(通过 pageLoad 事件)。

问题:

当我单击任一链接按钮来调整行数文本框值,然后更新 gridview 的页面大小时,gridview 之后显示为空白......就像没有可用的数据一样。

通过单击链接按钮更新行计数并且网格视图显示为空白后,我可以单击行计数文本框并按 Enter,现在显示网格视图,其页面大小与行计数文本框值匹配。这表明 gridview 数据仍然存在并且没有丢失。

研究

通过调试,我可以看到 pageload 事件在链接按钮单击事件之前触发,但我不明白为什么在链接按钮单击执行后 gridview 不显示。在代码隐藏中,在加载页面和链接按钮单击事件设置页面大小后重新绑定网格视图。

我需要什么帮助

我不确定如何纠正此行为,以便链接按钮单击事件正确更新并显示网格视图以匹配请求的页面大小。

我不想破坏页面生命周期。任何正常的 aspx 生命周期建议将不胜感激!

HTML sn-p

注意:我删除了一些 html 内容和所有 css 样式,以使相关的 html 元素更易于阅读。

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="SearchForEmployee.aspx.vb" Inherits="EmployeeSearch.SearchForEmployee1" EnableSessionState="True" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

...

</head>
<body>
    <form id="form1" runat="server">
...

<label>Row Count: <asp:TextBox ID="RowCount" runat="server" ClientIDMode="Static" Text="7" Width="50px"></asp:TextBox></label>
&nbsp;<asp:LinkButton ID="BtnRowCountUp" runat="server" ClientIDMode ="Static"><i class="fa fa-plus"></i></asp:LinkButton>
&nbsp;<asp:LinkButton ID="BtnRowCountDown" runat="server" ClientIDMode ="Static"><i class="fa fa-minus"></i></asp:LinkButton>
<br /><asp:RangeValidator ID="RowCountValidator" Type="Integer" MinimumValue="5" MaximumValue="20" ControlToValidate="RowCount" runat="server"></asp:RangeValidator>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanging="OnPageIndexChanging" OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound" ClientIDMode="Static" PageSize="7">

...

    </form>
</body>
</html>


CodeBehind sn-p

Public Class SearchForEmployee1
  Private dt As DataTable
  Private cRowCountMin As Integer = 5
  Private cRowCountMax As Integer = 20
  Private cRowCountInit As Integer = 7


  Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
      If Not Session("dt") Is Nothing Then
          dt = DirectCast(Session("dt"), DataTable)
      End If

      ...

      If Not Me.IsPostBack Then
          Me.RowCountValidator.MinimumValue = cRowCountMin.ToString
          Me.RowCountValidator.MaximumValue = cRowCountMax.ToString
          Me.RowCount.Text = cRowCountInit.ToString
      End If
  End Sub

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      If Not Me.IsPostBack Then
          ...  
      End If

      Me.GridView1.PageSize = CInt(Me.RowCount.Text)
      Me.GridView1.DataBind()

  End Sub

  Private Sub BtnRowCountUp_Click(sender As Object, e As EventArgs) Handles BtnRowCountUp.Click
      Dim iRowCount As Integer = CInt(Me.RowCount.Text)
      If iRowCount < cRowCountMax Then
          iRowCount += 1
          Me.RowCount.Text = iRowCount.ToString
          Me.GridView1.PageSize = iRowCount
          Me.GridView1.DataBind()
      End If
  End Sub

  Private Sub BtnRowCountDown_Click(sender As Object, e As EventArgs) Handles BtnRowCountDown.Click
      Dim iRowCount As Integer = CInt(Me.RowCount.Text)
      If iRowCount > cRowCountMin Then
          iRowCount -= 1
          Me.RowCount.Text = iRowCount.ToString
          Me.GridView1.PageSize = iRowCount
          Me.GridView1.DataBind()
      End If
  End Sub
 
  Protected Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles BtnSearch.Click
    ...

    '
    '  Fill datatable
    '

    ...
    
    Session("dt") = dt

  End Sub  

  ...

End Class

【问题讨论】:

    标签: html asp.net vb.net button gridview


    【解决方案1】:

    我突然明白了我没有尝试过的事情......而且它奏效了!

    解决方案是在重新绑定 gridview 之前重新应用数据表的会话值。我认为初始化页面执行足以重新初始化数据表变量,但事实并非如此。它还需要在按钮单击事件上完成。

    更新的代码隐藏:

        Private Sub BtnRowCountUp_Click(sender As Object, e As EventArgs) Handles BtnRowCountUp.Click
            Dim iRowCount As Integer = CInt(Me.RowCount.Text)
            If iRowCount < cRowCountMax Then
                iRowCount += 1
                Me.RowCount.Text = iRowCount.ToString
                Me.GridView1.PageSize = iRowCount
    
                If Not Session("dt") Is Nothing Then
                    dt = DirectCast(Session("dt"), DataTable)
                    Me.GridView1.DataSource = dt
                End If
    
                Me.GridView1.DataBind()
            End If
        End Sub
    
        Private Sub BtnRowCountDown_Click(sender As Object, e As EventArgs) Handles BtnRowCountDown.Click
            Dim iRowCount As Integer = CInt(Me.RowCount.Text)
            If iRowCount > cRowCountMin Then
                iRowCount -= 1
                Me.RowCount.Text = iRowCount.ToString
                Me.GridView1.PageSize = iRowCount
    
                If Not Session("dt") Is Nothing Then
                    dt = DirectCast(Session("dt"), DataTable)
                    Me.GridView1.DataSource = dt
                End If
    
                Me.GridView1.DataBind()
            End If
        End Sub
    
    

    【讨论】:

    • 我会把你的初始化代码移到加载事件中。如果 IsPostback = false,则第一次加载网格,将表推入会话。在额外的回发中,您可以将会话带到桌面上。不清楚为什么使用 init 事件,但我发现使用 on-load 效果更好。不管怎样,不管怎样,你现在看起来还可以。如果您将现有会话值设置为第一次加载回发 = false,那么您实际上不必测试现有会话值,因此页面上的任何附加操作 - 第一行代码上的 postack (true) 的 else 会将会话拉回表。
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多