2016-04-10 3 views
6

Das Problem tritt auf, wenn Sie eine Seite mit nur einem Datensatz öffnen. Es füllt das NavMenu mit drei Links; "First", "1" und "Last".Paging in ASP.NET; die Anzahl der Seiten ändert sich nach dem Filtern nie

Wenn Sie eine Suchanfrage ausführen, die mehr als eine Seite zurückgibt, werden aus irgendeinem Grund immer nur "First", "1" und "Last" angezeigt. Wenn Sie mit vier Seiten beginnen und Ihre nachfolgende Suchanfrage nur zwei Datensätze zurückgibt, werden weiterhin "Erste", "1", "2", "3", "4" und "Letzte" angezeigt. Aus irgendeinem Grund, egal wie viele Seiten Sie beginnen, werden Sie immer bekommen. Wie können Sie den Seitenzähler/das Display zurücksetzen?

Hier ist meine C# -Code-behind:

public void RunTheSearch() 
{ 
    //Run the Stored Procedure first 
    SqlConnection connection2 = new SqlConnection(strCon1); 
    SqlCommand cmd2 = new SqlCommand(); 
    cmd2.CommandType = CommandType.StoredProcedure; 
    cmd2.CommandText = "sp_Search"; 
    cmd2.Connection = connection2; 

    //--- A bunch of code that returns a dataset. Lengthy and unnecessary to my issue 

    connection2.Open(); 

    SqlDataAdapter adp = new SqlDataAdapter(cmd2); 


    DataSet ds = new DataSet(); 
    adp.Fill(ds, "OLDPages"); 

    //Pagination code so only a set number of records loads at a time. 
    // Done to speed up the loading, since this list gets really long. 
    PagedDataSource pds = new PagedDataSource(); 
    pds.DataSource = ds.Tables["OLDPages"].DefaultView; 

    pds.AllowPaging = true; 
    pds.PageSize = 10; 
    //NavMenu.Items.Clear(); 

    int currentPage; 

    if (Request.QueryString["page"] != null) 
    { 
     currentPage = Int32.Parse(Request.QueryString["page"]); 
    } 
    else 
    { 
     currentPage = 1; 
    } 

    pds.CurrentPageIndex = currentPage - 1; 
    //Label1.Text = "Page " + currentPage + " of " + pds.PageCount; 


    if (!pds.IsFirstPage) 
    { 
     MenuItem itemMessage = NavMenu.FindItem("First"); 
     itemMessage.NavigateUrl = Request.CurrentExecutionFilePath + "?page=1"; 
    } 

    AcctRepeater.DataSource = pds; 
    AcctRepeater.DataBind(); 

    CreatePagingControl(pds.PageCount, pds.CurrentPageIndex); 
    // End of Pagination code 

    connection2.Close(); 
} 

private void CreatePagingControl(int PCount, int PIndex) 
{ 
    int PIndex2 = 0; 
    int SCounter = PIndex + 1; 
    int RowCount = PCount; 

    //Allow the pagination menu to always start 5 less than the current page you're on 
    if (PIndex < 5) 
    { 
     PIndex2 = 0; 
    } 
    else 
    { 
     PIndex2 = PIndex - 5; 
    } 

    // Show 10 total page numbers. You can increase or shrink that range by changing the 10 to whatever number you want 
    for (int i = PIndex2; i < PIndex2 + 10 && i < PCount; i++) 
    { 
     NavMenu.Items.Add(new MenuItem 
     { 
      Text = (i + 1).ToString(), 
      NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (i + 1).ToString() 
     }); 

     // Now determine the selected item so the proper CSS can be applied 
     foreach (MenuItem item in NavMenu.Items) 
     { 
      item.Selected = item.Text.Equals(SCounter.ToString()); 
     } 
    } 

    NavMenu.Items.Add(new MenuItem 
    { 
     Text = "Last", 
     NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (PCount) 
    }); 
} 

Und auf der aspx Seite:

<asp:Menu ID="NavMenu" runat="server" CssClass="menu" 
    IncludeStyleBlock="false" Orientation="Horizontal" width="703px" 
    BackColor="#CC3300" EnableViewState="true"> 
    <Items> 
     <asp:MenuItem NavigateUrl="~/Default.aspx" Text="First" Selectable="true" /> 
    </Items> 
</asp:Menu> 

Ich versuche NavMenu.Items.Clear(), aber es hat nicht so, weil Es löschte auch das hartcodierte Element auf der Aspx-Seite.

+0

Anstelle von 'Clear()' können Sie 'Remove (MenuItem)' verwenden, um 'MenuItems' selektiv zu entfernen. – ctumturk

+0

Können Sie Ihre Methode zum Laden von Seiten posten? –

Antwort

0

Dies wurde schließlich, indem Sie das Menü in einem Update-Panel gelöst. Also, auf der aspx-Seite habe ich jetzt:

<div class="clear hideSkiplink" id="NavDiv" style="margin:0 auto; display: table;"> 
    <asp:UpdatePanel ID="NavUpdatePanel" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:Menu ID="NavMenu" runat="server" CssClass="menu" 
       IncludeStyleBlock="false" Orientation="Horizontal" width="703px" 
       BackColor="#CC3300" EnableViewState="false"> 
       <Items> 
        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="First" Selectable="true" /> 
       </Items> 
      </asp:Menu> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</div> 

Vielen Dank an alle, die es versucht haben. Es war tatsächlich, während ich auf die Posts antwortete, dass ein Schalter in meinem Gehirn weiterging und ich die Idee hatte, es zu versuchen.

1

Ich kann es nicht reproduzieren.

Meine Intuition sagt mir, dass Sie nicht zurück schreiben und deshalb müssen Sie die Ergebnisse löschen().

Dieser C# -Code funktioniert einwandfrei.

protected void Page_Load(object sender, EventArgs e) 
{ 
    RunTheSearch(); 
} 
+0

Diese Antwort ist falsch, sie hat mein Problem nicht behoben. –

+0

Es ist korrekt, ich konnte das Problem nicht mit dem genauen Code reproduzieren, den Sie zur Verfügung gestellt haben! Und ich habe dir einen Hinweis gegeben, in welche Richtung es zu gehen gilt.Ein Downvote für eine halbe Stunde, um dir zu helfen? Harsch. Mach das nicht nochmal. –

1

Sie das Abrufen der Daten aus einer gespeicherten Prozedur mit dem Namen sp_Search aber Ihre Abfrage in allen Läufen wird gleich sein, weil Sie keine Parameter in der gespeicherten Prozedur angegeben haben (basierend auf dem Code, den Sie auf dem Laufenden). Getestet habe ich Ihren Code durch die gespeicherte Prozedur zu modifizieren und einen Parameter an ihn schicken und auch mit NavMenu.Items.Clear() wie Sie gesagt haben und es funktioniert gut für mich:

Ihr SP sollte wie folgt sein:

CREATE PROCEDURE [dbo].[sp_Search] 
    @param1 NVARCHAR(50) 
AS 
    SELECT * from yourTableName where SearchField = @param1 
RETURN 0 

Und in C#:

public void RunTheSearch(string id) 
{ 
    ... 
    cmd2.CommandType = CommandType.StoredProcedure; 
    cmd2.CommandText = "sp_Search"; 
    cmd2.Parameters.Add("@param1", SqlDbType.NVarChar, 50).Value = id; 
    ... 
    ... 

Also in Ihrem Page_Load Aufruf der RunTheSearch Methode durch einen Parameter übergeben, die einen Datensatz zurückgibt:

protected void Page_Load(object sender, EventArgs e) 
{ 
    RunTheSearch("p1");    
} 

Und woanders rufen Sie die RunTheSearch Methode durch einen Parameter übergeben, die mehr Datensatz und Ergebnis zurückgibt würden mehr als eine Seite sein:

protected void Button1_OnClick(object sender, EventArgs e) 
{ 
    NavMenu.Items.Clear(); 
    RunTheSearch("p2"); 
}