2009-12-19 1 views
0

Теперь я успешно реализовал свой GridView, но, как всегда, весь жизненный цикл ASP.NET беспокоит меня. Я не могу понять, почему это не работает. Я вразумлял OnPageIndexChanged в GridView как таковой:ASP.NET GridView, включение/отключение кнопок после подкачки

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> 

Я отлаживать и увидеть, что код бежится и делает правильные вещи, но по какой-то причине, когда управление отображается, обе кнопки всегда включены. Что я здесь делаю неправильно?

ответ

2

Если бы я тебя, я бы его код, как это в методе «GridView_PageIndexChanged»

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

Edit: Вы можете также попробовать добавить сеттер?

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

Редактировать: ОК, мой друг, я, наконец, разработал решение. Может быть, не очень элегантный, но он работает, и я тестировал его. Есть несколько вещей, о которых стоит позаботиться: 1. У нас есть кнопка «Пред» и «Далее», и нам нужно обрабатывать события «OnCommand» для тех, поскольку мы используем наш собственный шаблон пейджера 2. Мы бы должны связывать данные после обработки нашего события OnCommand.

У меня есть статический List<String>, который я заполнил во время GET случайными строками (любезность: http://www.kivela.be/index.php/2007/06/19/how-to-generate-a-random-string-in-c-20/) и привязал их к моей сетке. Вы можете заменить свой собственный источник данных здесь. Также мы должны изменить индекс страницы сетки вручную в нашем OnCommand Event.

Вот моя 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(); 

    } 


} 

Надеется, что это помогает

+0

Интересно, честно говоря, я не пробовал код. Я использовал его так, как я упомянул ранее. Попробуй это ? – ram

+0

можете ли вы разместить свой код перед собой (aspx/ascx) для своей сетки? Дай взглянуть. Кроме того, вы привязываете данные к своей сетке снова, после разбивки на страницы? – ram

+0

@Ram: Я только привязываю GridView явно один раз, и это в 'OnLoad' (если'! IsPostBack'). Я добавил вопрос 'ascx' к вопросу. –

0

Есть ли шанс, что ваш CSS является установка включено свойством?

Я дублировал ваш код без CSS, и он отлично работает для меня.

Как насчет отправки вашего css?

+0

Извините, но я уверен, что CSS здесь не проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^