5

我有一个复杂的页面,上面有面板和许多控件。该页面包括一组过滤器和一个网格视图。通过选择不同的过滤器,我为我的 gridview 收到了不同数量的项目。这一切都有效,但更新速度很慢,即当我更改过滤器并按下更新按钮时。我需要找到一个解决方案来加快这个动作!所以这里有一个问题:是否可以只更新gridview的数据源而不重建整个页面。想法是尽快更新网格视图;网格中可能有超过 10,000 个项目。谢谢

4

1 回答 1

6

我建议将 GridView 和过滤器控件放入页面上的 UpdatePanel 中:

<asp:UpdatePanel runat="server" id="upData">
    <ContentTemplate>
        <div id="filterControls">
            <asp:TextBox runat="server" id="txtFilter"></asp:TextBox>
            <asp:Button runat="server" id="btnFilter" Text="Filter" />
        </div>

        <asp:GridView runat="server" id="gvItems">
            <EmptyDataTemplate>No results to display</EmptyDataTemplate>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

完成后,您可以简单地再次获取数据。正如您未指定的那样,我已经为 vb 和 c# 提供了代码:

C#

protected void Page_Load(object sender, EventArgs e)
{
    // get the data initially on page load
    if (!IsPostBack)
    {
        loadDataGrid();
    }
}

protected void btnFilter_Click(object sender, EventArgs e)
{
    loadDataGrid();
}

private void loadDataGrid()
{
    // call a procedure to get the data. This is what I use:
    // execDB(string commandText, string commandType, List<SqlParameter> args, bool newConnection);
    using (Database db = new Database())
    {
        List<SqlParameter> args = new List<SqlParameter>();
        args.Add(new SqlParameter("@filter1", SqlDbType.VarChar));
        args(args.Count - 1).Value = txtFilter1.Text;

        DataTable dt = db.execDB("Users_GetAll", "SP", args.ToArray(), false);

        if (dt.Rows.Count > 0)
        {
            gvItems.DataSource = dt;
            gvItems.DataBind();
        }
    }
}

VB

Protected Sub Page_Load(sender As Object, e As EventArgs)
    ' get the data initially on page load
    If Not IsPostBack Then
        loadDataGrid()
    End If
End Sub

Protected Sub btnFilter_Click(sender As Object, e As EventArgs)
    loadDataGrid()
End Sub

Private Sub loadDataGrid()
    ' call a procedure to get the data. This is what I use:
    ' execDB(string commandText, string commandType, List<SqlParameter> args, bool newConnection);
    Using db As New Database()
        Dim args As New List(Of SqlParameter)()
        args.Add(New SqlParameter("@filter1", SqlDbType.VarChar))
        args(args.Count - 1).Value = txtFilter1.Text

        Dim dt As DataTable = db.execDB("Users_GetAll", "SP", args.ToArray(), False)

        If dt.Rows.Count > 0 Then
            gvItems.DataSource = dt
            gvItems.DataBind()
        End If
    End Using
End Sub

这基本上会导致过滤器按钮更新 GridView,只获取它所需的数据,并且因为它位于 UpdatePanel 中,它还避免了回发整个页面,这应该会提高页面的整体速度。

希望这可以帮助!

于 2013-05-08T09:23:49.373 回答