隐藏 Gridview 直到数据表加载

Hide Gridview Until Datatable Loads

使用Gridview和Datatables,由于Gridview加载速度比datatable快,我想隐藏它直到datatable加载完成,这里找一个Gif of what happens (not mine Original Post).

我试图将显示属性更改为“none”并在数据表准备好后将其设置为“运行-in”,但我得到的结果是 image(请见下面的代码) 还尝试设置 Gridview.hide() 并在加载后 Gridview.show() 但它加载 gridview 然后隐藏它然后再次显示它。

HTML

<div class="spinner-border text-primary" style="display:block" id="spinner" runat="server" role="status">
<span class="sr-only">Loading...</span>
</div>
<asp:GridView ID="GridViewParts" style="display:none" OnRowDataBound="GridViewQuotes_RowDataBound"
runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSourcePart" >

剧本

$(document).ready(function () {
var table = $('#<%= GridViewParts.ClientID %>').DataTable(
   "fnDrawCallback": function () {
   // Hide the Loading Spinner...
   $('#<%= spinner.ClientID %>').hide();
   $('#<%= GridViewParts.ClientID %>').style.display ='run-in';
}

我做了一些研究,关于这个主题的帖子一直没有最终答案。

好的,所以我们要显示微调器,然后加载 table。

嗯,我打了一些相当大的 tables,响应时间不到一秒。我不明白如何(或为什么)加载一个包含超过 100 条记录的 gridview。达到这个数量之后,您就会用这么长的列表来折磨和虐待您的用户。所以根本不清楚为什么加载时间无论如何都不能低于 1 秒。

接下来,如果网格真的要有很多记录,那么你真的需要引入一个数据分页器。这又会说一次只能拉取 30-40 条记录,再一次,这意味着延迟很少。

然而,说了这么多?那么,我们可以这样设置:

当我们显示页面时,我们还会显示微调器。然后我们让客户端浏览器触发按钮加载并显示网格。

所以,让我们将微调器放在页面上 - 一个按钮和一个网格视图。

单击按钮时将显示我们的网格 - 我们将隐藏此按钮并让浏览器自动为我们单击此按钮。

既然网页和后台代码运行都是一次性的,那我们就不能写后台代码来显示微调器,加载网格,隐藏微调器了。我们不能这样做,因为所有 3 个操作都将 运行 在代码隐藏中一次。当代码隐藏在 运行s 时,网页就在服务器上。只有当后面的代码完成后,页面才会发送到客户端,然后显示内容。

因此,我们必须执行以下操作:

让页面加载,代码隐藏 运行s,然后将其发送到客户端。此时页面将显示微调器或其他内容。

然后浏览器端(客户端)现在必须触发网格视图加载。如前所述,我们只使用放置在表单上的常规标准按钮。

所以,我们有这个标记:

        <div id="MySpinner" runat="server">
            <img src="Content/wait2.gif" />
        </div>

        <asp:Button ID="cmdLoadGrid" runat="server" Text="Button" ClientIDMode="Static" Style="display:normal" />

        <div id="MyGrid" runat="server">
            <asp:GridView ID="GridView1" runat="server"></asp:GridView>
        </div>

        <script>
            function LoadMyGrid() {
                mybtn = document.getElementById("cmdLoadGrid")
                mybtn.click()
            }
        </script>

所以它看起来像这样:

好的,现在让我们双击按钮,我们跳到后面的代码。

我们有这个:

Protected Sub cmdLoadGrid_Click(sender As Object, e As EventArgs) Handles cmdLoadGrid.Click

    Dim strSQL As String = "SELECT ID, FirstName, LastName, HotelName, City from tblHotels"

    Using cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.TEST3))

        cmdSQL.Connection.Open()
        GridView1.DataSource = cmdSQL.ExecuteReader
        GridView1.DataBind()

    End Using

    ' hide the spinner
    MySpinner.Style("Display") = "none"
    MyGrid.Style("Display") = "normal"

End Sub

好的,现在让我们隐藏标记中的按钮。

例如:

<asp:Button ID="cmdLoadGrid" runat="server" Text="Button" ClientIDMode="Static" Style="display:none" />

好的,现在在我们的第一个页面加载中,我们将页面设置为 run/trigger 我们上面的 js 例程,点击我们的按钮 运行 后面的代码来加载网格。

但是,由于此按钮点击发生在页面发送到客户端并呈现之后,因此用户将在加载网格时看到微调器。

加载事件是这样的:

    If IsPostBack = False Then
        ' first page load - set our client side function
        ' LoadMyGrid() to run

        Dim strMyJava = "LoadMyGrid()"
        Page.ClientScript.RegisterStartupScript(Me.GetType(), "My Load script", strMyJava, True)

    End If

我们已经做到了。

结果如下所示:

如前所述,由于网格加载速度如此之快,因此微调器不会在视图中停留很长时间。但是,如果网格确实需要几秒钟,那么微调器将显示几秒钟。