【问题标题】:update gridview without rebuilding whole page更新gridview而不重建整个页面
【发布时间】:2013-04-12 03:31:22
【问题描述】:

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

【问题讨论】:

    标签: gridview postback


    【解决方案1】:

    我建议将 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 中,它还避免了回发整个页面,这应该会提高页面的整体速度。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2017-06-13
      • 2016-02-17
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多