【问题标题】:ASP.NET GridView, enabling/disabling buttons after pagingASP.NET GridView,分页后启用/禁用按钮
【发布时间】:2010-12-28 09:04:49
【问题描述】:

我现在已经成功实现了我的 GridView,但是,与往常一样,整个 ASP.NET 生命周期的事情都困扰着我。我不明白为什么这不起作用。我已将 GridView 的 OnPageIndexChanged 绑定为:

protected void GridView_PageIndexChanged(object sender, EventArgs e)
{
    // Enable/disable the previous/next buttons.
    LinkButton btnNextPage = (LinkButton)gvTable.BottomPagerRow.FindControl("btnNextPage");
    LinkButton btnPreviousPage = (LinkButton)gvTable.BottomPagerRow.FindControl("btnPreviousPage");
    btnNextPage.Enabled = false;
    btnPreviousPage.Enabled = false;
}

这是我的 ASCX:

<asp:GridView ID="gvTable" runat="server" ShowHeader="true" PageSize="1" 
  AllowPaging="true" AllowSorting="true" DataSourceID="dsLinqActivities"
  AutoGenerateColumns="false" OnRowDataBound="GridView_DataBound"
  OnPageIndexChanged="GridView_PageIndexChanged">
  <Columns>
    <asp:BoundField DataField="Edited" HeaderText="Date" />
    <asp:BoundField DataField="Status" HeaderText="Status" />
    <asp:BoundField DataField="Activity" />
  </Columns>
  <PagerSettings Position="Bottom" Visible="true" />
  <PagerStyle CssClass="pager" />
  <PagerTemplate>
    <asp:LinkButton ID="btnPreviousPage" class="navbtn prev left"
      runat="server" CommandName="Page" CommandArgument="Prev">
      <span>Newer activities</span></asp:LinkButton>
    <asp:LinkButton ID="btnNextPage" class="navbtn next right"
      runat="server" CommandName="Page" CommandArgument="Next">
      <span>Older activities</span></asp:LinkButton>
  </PagerTemplate>
</asp:GridView>

我调试我的应用程序并看到代码正在运行并且执行正确的操作,但由于某种原因,当呈现控件时,两个按钮始终处于启用状态。我在这里做错了什么?

【问题讨论】:

    标签: c# asp.net gridview user-controls pagination


    【解决方案1】:

    如果我是你,我会在“GridView_PageIndexChanged”方法中这样编码

    (gvTable.BottomPagerRow.FindControl("btnNextPage") as LinkButton).Enabled = true/false;
    

    编辑:你也可以尝试添加一个 setter 吗?

    set
    {
     gvTable.BottomPagerRow.FindControl("btnNextPage") as LinkButton  =value;
    }
    

    编辑:好的,我的朋友,我终于找到了解决方案。可能不是很优雅,但它有效并且我测试了它。有几点需要注意: 1. 我们有一个“上一个”和一个“下一个”按钮,我们必须为那些处理“OnCommand”事件,因为我们使用的是我们自己的寻呼模板 2. 我们必须在处理完 OnCommand 事件后绑定数据。

    我有一个静态的List&lt;String&gt;,我在 GET 期间用随机字符串填充了它(礼貌:http://www.kivela.be/index.php/2007/06/19/how-to-generate-a-random-string-in-c-20/)并将它们绑定到我的网格。您可以在此处替换您自己的数据源。此外,我们必须在 OnCommand 事件中手动更改网格的页面索引。

    这是我的 aspx/ascx 网格

        <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView_DataBound" 
        AllowPaging="true" PagerSettings-Mode="NextPrevious" PagerSettings-Position="Bottom" PageSize="10"
      OnPageIndexChanged="GridView_PageIndexChanged">
        <PagerSettings Position="Bottom" Visible="true" />
        <PagerStyle CssClass="pager" />
        <PagerTemplate>
          <asp:LinkButton ID="btnPreviousPage" OnCommand="ChangePage"
            runat="server" CommandName="Prev"   Text="prev">
            </asp:LinkButton>
          <asp:LinkButton ID="btnNextPage" OnCommand="ChangePage"
            runat="server" CommandName="Next"  Text="next">
            </asp:LinkButton>
        </PagerTemplate>
    
      </asp:GridView>
    

    这里是代码隐藏

    public partial class TestPage : System.Web.UI.Page 
    {
        private static Random _random = new Random();
        static List<string> lst = new List<string>();
        protected void Page_Load(object sender, EventArgs e) 
        {
    
    
            if (!Page.IsPostBack)
            {
                for (int i = 1; i <= 30; i++)
                {
                    lst.Add(RandomString(i));
                }
    
                GridView1.DataSource = lst;
                GridView1.DataBind();
                SetPageNumbers();
            }
    
        }
    
        private void SetPageNumbers()
        {
            if (GridView1.PageIndex == 0)
            {
                (GridView1.BottomPagerRow.FindControl("btnPreviousPage")as LinkButton).Enabled = false;
    
             }
    
            if(GridView1.PageIndex ==GridView1.PageCount-1)
            {
                (GridView1.BottomPagerRow.FindControl("btnNextPage") as LinkButton).Enabled = false; 
            }
    
        }
    
        protected void ChangePage(object sender, CommandEventArgs e)
        {
    
            switch (e.CommandName)
            {
                case "Prev":
                    GridView1.PageIndex = GridView1.PageIndex - 1;
                    break;
    
                case "Next":
                    GridView1.PageIndex = GridView1.PageIndex + 1;
                    break;
            }
            GridView1.DataSource = lst;
            GridView1.DataBind();
            SetPageNumbers();
        }
    
    
        public static string RandomString(int size)
        {
    
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < size; i++)
            {
    
                //26 letters in the alfabet, ascii + 65 for the capital letters
                builder.Append(Convert.ToChar(Convert.ToInt32(Math.Floor(26 * _random.NextDouble() + 65))));
    
            }
            return builder.ToString();
    
        }
    
    
    }
    

    希望对你有帮助

    【讨论】:

    • 有趣,说实话我没有尝试代码。我曾经像我之前提到的那样设置它。试试看?
    • 你可以为你的网格发布你的代码前端(aspx/ascx)吗?让我看一看。另外,您是否在分页后再次将数据绑定到您的网格?
    • @Ram:我只明确地对 GridView 进行了一次数据绑定,并且在 OnLoad 中(如果 !IsPostBack)。我在问题中添加了ascx
    • 非常感谢,Ram,如果可以的话,我会给你 10 次“接受”的机会。遗憾的是,我们似乎无法解决 OnPageIndexChanged 的​​问题。 :(
    【解决方案2】:

    您的 CSS 是否有可能设置了 enabled 属性?

    我在没有 CSS 的情况下复制了您的代码,它对我来说很好。

    发布你的 CSS 怎么样?

    【讨论】:

    • 抱歉,我很肯定 CSS 不是这里的问题。
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多