Avatar billede chw Nybegynder
20. februar 2006 - 15:16 Der er 29 kommentarer og
1 løsning

Rigtig brug af paging i .net 2.0 gridview

Jeg bruger et .net 2.0 gridview. Den har eventen PageIndexChanging. Det virker udmærket, men jeg gemmer i øjeblikket min collection i en Sessionsvariabel, for at den skal kunne huske det. Er det den rigtige måde at gøre det på.

protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gwMain.DataSource=Session["datasource"];
        gwMain.PageIndex = e.NewPageIndex;
        gwMain.DataBind();
         
    }
Avatar billede Slettet bruger
20. februar 2006 - 15:34 #1
Du behøver ikke benytte en session variabel.
Sæt EnableViewState til true og den husker alle værdierne fra din liste mellem hvert postback.
Avatar billede dr_chaos Nybegynder
20. februar 2006 - 17:57 #2
EnableViewState bør være sat til true som standard.
hvis den ikke er det. Kan det være problemet.

Ellers er det fordi datasourcen til dit gridview bliver bundet igen ved postback.
Avatar billede chw Nybegynder
21. februar 2006 - 14:36 #3
Så det burde være nok at gøre således ik?

protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
              gwMain.PageIndex = e.NewPageIndex;         
    }

Jeg har skrevet e.NewPageIndex ud når jeg klikker, synes det er underlig at den er 1 hver gang, den burde vel være 2 når jeg trykker på 2-tallet.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 14:39 #4
normalt behøver du ikke at bruge noget i denne stil du benytter hvis dit gridview er bundet til en datasource og ikke bliver bundet igen ved postback så burde den selv skifte page.
Et index starter altid på 0.
så når du får side 1 vist er pageindex 0.
Avatar billede chw Nybegynder
21. februar 2006 - 14:47 #5
er ikke lige helt med, hvad behøver jeg ikke.

Den viser godt nok at der er 3 sider, og den viser også at den nu er på side 2. Men det den viser i gridet er hele tiden side 1.

Der er hvis jeg bruger gwMain.PageIndex = e.NewPageIndex;
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 14:52 #6
prøv helt at fjerne

protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
              gwMain.PageIndex = e.NewPageIndex;       
    }
Avatar billede chw Nybegynder
21. februar 2006 - 14:53 #7
når man så klikker på næste side kommer denne fejl

The GridView 'gwMain' fired event PageIndexChanging which wasn't handled
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 14:54 #8
prøv at paste hele din codebehind fil.
og fjerne PageIndexChanging fra dit gridview
Avatar billede chw Nybegynder
21. februar 2006 - 15:00 #9
den er fjernet fra codebehind og også fra min webform. Mener du jeg skal paste den herind?
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 15:02 #10
ja din codebehind + koden til dit gridview.
Hvis altså at paging ikke fungerer korrekt nu
Avatar billede chw Nybegynder
21. februar 2006 - 15:05 #11
<asp:GridView ID="gwMain" OnSorting ="gwMain_OnSorting" runat="server" AutoGenerateColumns="False" AllowSorting="True" BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Horizontal" AllowPaging="True" PageSize="1">
          <Columns>
              <asp:TemplateField HeaderText="Logo">       
              <ItemTemplate>
              <a href="#" onclick="window.open('<%#Eval("storelink")%>')"><img style="border: none;" width="50px" alt='<%#Eval("storename")%>' src='<%#Eval("logopath") %>'/></a>
              </ItemTemplate>
                </asp:TemplateField> 
                 
              <asp:TemplateField HeaderText="Tekst" >
                  <ItemTemplate>
                  <a href="#" onclick="showdetails('<%# Server.HtmlDecode(Eval("tilbudslink").ToString())%>');" > <asp:Label ToolTip='<%# Server.HtmlDecode(Eval("tilbudssubtext").ToString())%>' ID="text" runat="server" Text='<%# Server.HtmlDecode(Eval("tilbudstextForGrid").ToString())%>'></asp:Label></a>
                  </ItemTemplate>
                    <ControlStyle Width="200px" Font-Names="Arial" Font-Overline="False"/>
                    <HeaderStyle HorizontalAlign="Left" />
                    <ItemStyle HorizontalAlign="Left" VerticalAlign="Bottom" Width="150px" Wrap="False" Font-Names="Arial" Font-Size="Small" ForeColor="RoyalBlue"/>
                </asp:TemplateField>
               
                <asp:TemplateField HeaderText="Til">
                <ItemTemplate>
                    <asp:Label ID="til" runat="server" Text='<%# Server.HtmlDecode(Eval("dateto").ToString().Remove(5))%>'></asp:Label>
                  </ItemTemplate>
                  <ControlStyle Width="40px" />
                    <HeaderStyle HorizontalAlign="Left" />
                    <ItemStyle VerticalAlign="Bottom" Font-Names="Arial" Font-Size="Small" />
                </asp:TemplateField>
               
                <asp:TemplateField SortExpression="beforeprice"  HeaderText="F&#248;rpris">
                <ItemTemplate>
                    <asp:Label ID="fpris" runat="server" Text='<%#Eval("beforeprice").ToString() + " kr."%>'></asp:Label>
                  </ItemTemplate>             
                  <ControlStyle Width="70px"  />             
                    <ItemStyle HorizontalAlign="Right" VerticalAlign="Bottom" Font-Names="Arial" Font-Size="Small" />
                    <HeaderStyle HorizontalAlign="Right" />
                </asp:TemplateField>
               
                <asp:TemplateField HeaderText="Nu" SortExpression="price">
                <ItemTemplate>
                    <asp:Label ID="nu" runat="server" Text='<%#Eval("price").ToString() + " kr."%>'></asp:Label>
                  </ItemTemplate>
                  <ControlStyle Width="70px" />
                    <HeaderStyle HorizontalAlign="Right" />
                    <ItemStyle HorizontalAlign="Right" VerticalAlign="Bottom" Font-Names="Arial" Font-Bold="True" Font-Size="Small" />
                </asp:TemplateField>
               
                <asp:TemplateField HeaderText="Spar">
                            <ItemTemplate>
                            <asp:Label ID="forskel" runat="server" Text='<%# Eval("diff") + " kr."%>'></asp:Label>                            </ItemTemplate>
                            <ControlStyle Width="70px" />
                    <HeaderStyle HorizontalAlign="Right" />
                    <ItemStyle HorizontalAlign="Right" VerticalAlign="Bottom" Font-Names="Arial" Font-Size="Small" />
                </asp:TemplateField>
               
                  <asp:TemplateField HeaderText="Image">       
              <ItemTemplate>
                <img style="border: none;" width="50px" alt='<%#Eval("imagedescription")%>' src='<%#Eval("imagelink") %>'/>
              </ItemTemplate>
                </asp:TemplateField> 
            </Columns>
            <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
            <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
            <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
            <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
            <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
            <AlternatingRowStyle BackColor="#F7F7F7" />

        </asp:GridView>
Avatar billede chw Nybegynder
21. februar 2006 - 15:09 #12
Her er metoden der henter data og binder det til mit grid.

private void db2(string sql, string orderby)
    {
        SqlCommand cmdGetData = new SqlCommand();
        Session["lastsql"] = sql;

        if (orderby != null)
        {
            sql += orderby;
        }
        cmdGetData.CommandText = sql;
        cmdGetData.Connection = conn;

        conn.Open();

        SqlDataReader drGetData = cmdGetData.ExecuteReader();
        Tilbudscollection coltilbud = new Tilbudscollection();
       
       
        while (drGetData.Read())
        {
            coltilbud.Add(new Tilbud(int.Parse(drGetData["tilbudid"].ToString())));   
        }

        if (drGetData.HasRows == false)
        {
            info.InnerHtml = "Der var desværre ingen tilbud. Prøv evt. med flere butikker eller en anden dato :-) <br><br>Med venlig hilsen<br><br>Tilbudsavisen";
        }

        gwMain.DataSource = coltilbud;
        gwMain.DataBind();
        conn.Close();
    }
Avatar billede chw Nybegynder
21. februar 2006 - 15:10 #13
når jeg klikker på et næste side kommer jeg i pageload, men der laver jeg ikke noget
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 15:20 #14
hvornår kaldes db2 ?
Avatar billede chw Nybegynder
21. februar 2006 - 15:28 #15
kun når jeg loader og når jeg foretager en søgning. Den bliver ikke kaldt når jeg skifter side. Har lige testet det
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 15:29 #16
og du kan ikke skifte paging index ?
Avatar billede chw Nybegynder
21. februar 2006 - 15:32 #17
har også tilføjet EnableViewState="true" til mit grid.

Jeg har slettet mine event som du foreslog. Nej for denne fejl.

The GridView 'gwMain' fired event PageIndexChanging which wasn't handled
Avatar billede chw Nybegynder
21. februar 2006 - 15:32 #18
fejlen kommer med det samme jeg trykker på næste side
Avatar billede Slettet bruger
21. februar 2006 - 15:39 #19
Med mindre du skal arbejde specifikt med dine data fra codebehind er det slet ikke nødvendigt det du gør fra din codebehind.

protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gwMain.DataSource=Session["datasource"];
        gwMain.PageIndex = e.NewPageIndex;
        gwMain.DataBind();
       
    }

Du kan nøjes med at trække et gridview ind på formen og dernæst specificere din datasource. Husk at vælge "enable paging" i dit gridview.

Hvad er det helt konkret du vil lave med page_Indexchanged?

Du kan også lave en metode, der hedder "BindGrid" og kalde den fra din page_load første gang - altså:

protected_void Page_Load(... ....)
{
if(!Page.IsPostBack)
{
BindGrid();
}
}

På denne måde kan du binde data i dit grid når siden loades og derefter beholdes data i ViewState ved hvert postback.

Men igen, hvis du ikke SKAL gøre noget specifikt med dine data behøver du slet ikke at lave det du skriver i dit første indlæg.
Du kan jo gøre stort set alt direkte via gridviews metoder, altså slette, oprette og opdatere rækker fra databasen.
Avatar billede Slettet bruger
21. februar 2006 - 15:41 #20
P.S. Hvis sletter en event fra din codebehind fil skal du huske at slette den fra din .aspx sides source også. Dette gøres ikke automatisk, så det bevirker at selve gridview indeholder en event, men at denne ikke findes i codebehin-filen.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 15:43 #21
den fejl du får kommer på grund af den måde at data bliver bundet på.
Den ville ikke komme med en sqldatasource f.eks.
så du skal bruge:
protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gwMain.PageIndex = e.NewPageIndex;
        gwMain.DataBind();
       
    }

Ved ikke om det er nødvendigt med sessionen.
men hvis der ikke sker noget skal du bruge den.
Avatar billede chw Nybegynder
21. februar 2006 - 16:00 #22
Det er nødvendigt at bruge sessions, da ellers min collection er tom.

Jeg har hurtig forsøgt dit forslag thomasso, men uden held.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 16:04 #23
virkede dette:
protected void gwMain_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gwMain.DataSource=Session["datasource"];
        gwMain.PageIndex = e.NewPageIndex;
        gwMain.DataBind();
       
    }
hvis det gjorde skal du bruge det.
Det er den rigtige metode når du databinder på den måde som du gør.
Avatar billede chw Nybegynder
21. februar 2006 - 16:12 #24
ja det virker. Det var også det jeg skrev helt i starten. Var bare ikke klar over om det var den rigtige metode.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 16:15 #25
hvis du havde brugt sqldatasource var det ikke den rigtige metode.
Men når du ikke gør det så er det den rigtige metode.
Havde bare noget uvidenhed eller manglende viden på området. Som gjorde at jeg ikke kunne give dig bedre rådgivning.
Tror bare at du selv skal svarer og accepterer dit svar.
Avatar billede Slettet bruger
21. februar 2006 - 20:56 #26
Databindingen er fin nok, men forstår bare stadig ikke hvorfor du vil optage hukommelse med en session-variabel.

Hvis du binder din collection første gang siden loades burde det ikke være noget problem med postbacks. Givet at du benytter ViewState=true.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 20:59 #27
han er nød til at gøre det p.ga den måde han databinder på.
Avatar billede dr_chaos Nybegynder
21. februar 2006 - 21:01 #28
eller også skal han kalde sin databind medtode.
sætte page index og kalde databind igen
Avatar billede chw Nybegynder
03. februar 2007 - 18:02 #29
lig et svar
Avatar billede dr_chaos Nybegynder
03. februar 2007 - 23:23 #30
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester