【问题标题】:ASP.Net Gridview.Rows.Count is giving wrong countASP.Net Gridview.Rows.Count 计数错误
【发布时间】:2015-05-23 00:55:23
【问题描述】:

我有一个默认分页的 Gridview (BudgetGridView),每页 30 行。每年一次,此网格视图中的数据会更新一次。为了实现这一点,我正在使用我在网上找到的一些非常漂亮的代码 (http://highoncoding.com/) 来编辑这个 gridview 的所有行。作为该编辑过程的一部分,我禁用了分页,以便用户可以轻松地编辑和滚动整个网格视图,直到他们到达底部并在一个操作中保存所有编辑。分页禁用发生在这里:

        if (myLabel == "  Edit All  ")
        {
            isEditMode = true;
            BudgetGridView.AllowPaging = false;
            EditAllButton.Text = "  Save Edits  ";
            BindBudgetGridView();
        }

此时,gridview 是完全可编辑的,而且效果很好。当用户保存时,点击上面代码的“else”,我遇到了这个帖子主题的问题。这是其他的:

        else
        {
            isEditMode = false;
            EditAllButton.Text = "  Edit All  ";
            SaveData();  // Problem is here...
            BudgetGridView.AllowPaging = true;
            BindBudgetGridView();
        }

当上面调用 SaveData() 时,它看起来像这样:

protected void SaveData()
    {
        // total count for an update loop
        int totalRowsCount = BudgetGridView.Rows.Count;

它没有返回正确的计数(大约 250 行),而是给我一个值 30,这是分页值,但分页被禁用。如果有帮助,这里是 gridview 的属性:

                <asp:GridView 
                    ID="BudgetGridView" runat="server"
                    HeaderStyle-ForeColor="#FFFFFF" 
                    ShowFooter="True" 
                    HeaderStyle-BackColor="#546E96"
                    FooterStyle-BackColor="#C3CFDD" 
                    AllowPaging="True" 
                    PageSize="30" 
                    OnPageIndexChanging="BudgetGridView_PageIndexChanging"
                    AlternatingRowStyle-BackColor="#FFFFCC"  
                    AutoGenerateColumns="False" 
                    DataKeyNames="KeyID"   
                    BackColor="White"
                    HorizontalAlign="Center" 
                    OnRowDeleting="BudgetGridView_RowDeleting"
                    EnableViewState="false">

有什么想法为什么我的行数是 30 而不是完整的 250 左右?

【问题讨论】:

  • 您可能希望使用数据源中的“行数”而不是 GridView。
  • 这听起来像是页面生命周期问题。您提到的 if/else 语句在页面生命周期的哪个阶段发生?
  • Colin,如果我正确理解了您的问题,页面已完全加载,用户已检查数据并决定单击“全部编辑”按钮。这会将 GridView ItemTemplate 项更改为文本字段。用户进行了编辑并单击了现在显示“保存编辑”的相同按钮,这将我们带到了计数问题。此时我们处于上述 If/Else 的“Else”中,并已移至 SaveData 部分。
  • 戴夫,我也有同样的想法。我可能不得不走那条路。然而,我只是头脑清醒,想让这个 GridView 行计数工作。这就是我们拥有它的原因。 ;-) 我真的需要努力解决这种顽固的问题。
  • 呸!!戴夫和科林,我确实使用数据库中的计数(1041,超过 200)来解决这个问题,有趣的是,在我的更新循环中,一旦它达到 30(从 0 开始的第 31 条记录),我得到一个超出范围的索引异常,这表明它正在尝试从 Gridview 的第 31 行获取数据,但认为页面上只有 30 个。我正在查看包含 1041 条记录的完整网格视图。 Colin,你能详细说明一下页面生命周期的概念吗?后台代码确信 gridview 中只有 30 行。

标签: c# asp.net gridview pagination


【解决方案1】:

解决了!!

解决方案是在代码隐藏中处理分页并将其从 aspx 中删除。只要它在 aspx 中的 GridView 的属性中,我在代码隐藏中所做的任何事情都没有任何效果。所以,我把aspx改成这样:

                <asp:GridView 
                ID="BudgetGridView" runat="server"
                HeaderStyle-ForeColor="#FFFFFF" 
                ShowFooter="True" 
                HeaderStyle-BackColor="#546E96"
                FooterStyle-BackColor="#C3CFDD" 
                OnPageIndexChanging="BudgetGridView_PageIndexChanging"
                AlternatingRowStyle-BackColor="#FFFFCC"  
                AutoGenerateColumns="False" 
                DataKeyNames="KeyID"   
                BackColor="White"
                HorizontalAlign="Center" 
                OnRowDeleting="BudgetGridView_RowDeleting"
                EnableViewState="false">

...并将这些语句放在代码隐藏中我需要它们的位置:

            //kill pagination
        BudgetGridView.AllowPaging = false;
        BudgetGridView.PageSize = 5000;

        //resurrect pagination
        BudgetGridView.AllowPaging = true;
        BudgetGridView.PageSize = 30;

现在,我们正在用煤气做饭!!

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 2016-08-13
    • 2020-04-05
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多