webForumDet fria alternativet

paging - datagrid eller inte?

.NET

2 svar · 332 visningar · startad av laidback

Medlem sedan maj 2001797 inlägg
Frågan#1

Jag försöker mig på det här med paging, men skulle behöva lite hjälp.

Har en sida, viewmessage.aspx, som ska visa en post ur en tabell, beroende på vilken querystring som skickas med. Så långt allt väl. Väl där vill jag kunna hoppa till föregående/nästa post MEN bara mellan poster med samma userID, alltså skrivna av samma person.

Idag specificeras postens ID i sql-frågan, är det fel? Ska jag i stället specificera skribentens ID (dvs hämta alla av samma skribent direkt, i stället för bara en post) och sedan när jag skriver ut posten specificera vilken post som ska skrivas ut?
Hur ska det se ut när jag skriver ut det isf?

Hur gör jag sedan med pagingen? DataGrid har ju inbyggd paging, men det handlar om hundratals poster per skribent, det verkar lite otympligt (resurskrävande?) att ha alla dessa med från sida till sida bara för att ordna fram och bakåt-knappar. (Som jag fattat det iaf?)
Jag skulle lika gärna kunna använda en repeater eller datalist, men där finns väl inte inbyggd paging?

Kollade lite på CustomPaging men där förstod jag det som att det måste vara en "obruten" rad av postID's för att det ska funka, dvs det funkar inte om man raderat ett inlägg.
Vad är mest effektivt och resurssnålt? Använda den inbyggda pagingen eller bygga en egen?

Medlem sedan sep. 20026 425 inlägg
#2

Jag använder mig av ett dataset och pagedDataSource. default.aspx:

<%@ Page Language="VB" Inherits="db_paging" Src="behind/codebehind.vb" Debug="True" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>Titel</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <form id="paging" runat="server">
        <asp:Repeater id="main" runat="server">
            <ItemTemplate><%# Container.DataItem("Namn") %><br /></ItemTemplate>
        </asp:Repeater>
        <asp:label id="lblerror" runat="server"></asp:label>
        <asp:literal id="num_paging" runat="server" />
        <asp:label id="lblerror2" runat="server"></asp:label>
        <asp:label id="lblerror3" runat="server"></asp:label>
    </form>
</body>
</html>

codebehind.vb:

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.OleDb
Imports System.Text
Imports Microsoft.VisualBasic

Public Class db_paging : Inherits Page

    Dim pagedData As new pagedDataSource
    Dim PageCounter, RecsCount, Show As integer

    protected withevents main As Repeater
    protected withevents lblerror, lblerror2, lblerror3 As label
    protected withevents num_paging As literal

    'proceduren som körs varje gång sidan laddas
    Sub Page_Load(byVal obj As Object, byVal e As EventArgs)
        If Not Page.IsPostBack Then
            lblerror.Visible = False
            lblerror2.Visible = False
            lblerror3.Visible = False
            doPaging()
            NumericPages()
        End If
    End Sub

    'funktionen för att plocka ut info ur databasen och fylla en OleDbDataAdapter med den
    Function getData() As DataTable

        'variabler för SQL-satsen, ett DataSet, anslutningensträngen till databasen, samt anslutningen till databasen
        Dim SQL As string = "SELECT Namn FROM tbl ORDER BY Id"
        Dim ds As new DataSet()
        Dim CnStr As string = "Provider=Microsoft.Jet.OleDb.4.0; data source=" & Server.MapPath("db.mdb")
        Dim Cn As new OleDbConnection(CnStr)

        'skapa en OleDbDataAdapter och fyll Datasetet
        Dim ODA As new OleDbDataAdapter(SQL, Cn)
        ODA.Fill(ds, "tbl")

        Return ds.Tables("tbl").Copy

        'frigör resurser använda av OleDbDataAdaptern
        ODA.Dispose()

    End Function

    'proceduren där parametrar för själva pagingen ställs in
    Sub doPaging()

        'ange en datakälla till pagingen (funktionen ovan), tillåt paging samt ange antalet poster som ska visas per sida
        pagedData.DataSource = getData().DefaultView
        pagedData.AllowPaging = True
        pagedData.PageSize = 10 '<--- ändra siffran här till antalet poster du vill ha per sida

        'räkna
        RecsCount = pagedData.DataSourceCount

        'felhantering med try..catch
        Try
            If Len(Request.Querystring("page"))=0 Then
                pagedData.CurrentPageIndex = 0
            Else
                If Not IsNumeric(Request.Querystring("page")) Then
                    lblerror2.Visible = True
                    lblerror2.Text = "<p>Adressen till sidan måste vara numerisk, inte """ & Request.Querystring("page") & """.</p>"
                Else
                pagedData.CurrentPageIndex = Cint(Request.QueryString("page")) '.ToString()
                End If
            End If

        'fånga upp eventuella fel på sidan och skriv ut felmeddelandet
        Catch ex As Exception
            pagedData.CurrentPageIndex = 0
            lblerror3.Visible = True
            lblerror3.Text = "Error: <b>" & ex.Message & "</b>"
        End Try

        'bind data till repeatern på huvudsidan
        main.DataSource = pagedData
        main.DataBind()

    End Sub

    'proceduren för att skriva ut (den numeriska) sidnavigeringen
    Public Sub NumericPages()

        'felhantering om användaren skriver i ett pagingtal i adressen som inte finns
        If pagedData.CurrentPageIndex > pagedData.PageCount Then
            lblerror.Visible = True
            lblerror.Text = "Sidan " & Request.Querystring("page") & " finns inte i pagingen. Vänligen välj en sida nedan eller backa.<br />"
            Show = 1
        Else
            Show = 1
        End If

        If Not Show = 0 Then

            'skapa en StringBuilder för att kunna for .. next-loopen nedan ska fungera
            Dim sb As new StringBuilder()

            'for ... next-loopen för att skriva ut sidnavigeringen
            'för tillfället blir sidan man är på ingen länk i pagingen, vill du att även den ska vara
            'en länk så raderar du allt inom for ... next-loopen förutom den första sb.Append-raden
            For Pagecounter = 1 To pagedData.PageCount
                If Not pagedData.CurrentPageIndex = PageCounter-1 Then
                    sb.Append("<a href=""default.aspx?page=" & PageCounter-1 & """>" & PageCounter & "</a> ")
                Else
                    If Not RecsCount <= pagedData.PageSize Then
                        sb.Append(Pagecounter & " ")
                    End If
                End If
            Next

            'skriv ut StringBuilderns data
            num_paging.Text = sb.toString()

        End If

    End Sub

End Class
Medlem sedan maj 2001797 inlägg
#3

Tack för svaret. Det här halkade ner en bit på min "att göra lista", tittar närmare på det när jag kommit dit igen :)

271 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)