Avatar billede websam Nybegynder
08. marts 2006 - 03:02 Der er 28 kommentarer og
1 løsning

Sortering i gridview ?

Hejsa,

Jeg kan ikke få det sidste på plads med sortering i et gridview. I min page_load laver jeg dette :

    If Not Page.IsPostBack Then
        GridView1.PageIndex = 0         
        If IsNothing(ViewState("SortOrder")) Then               
            objBLL.GetAll("Id ASC")
        Else             
            objBLL.GetAll(ViewState("SortOrder").ToString())
        End If
        GridView1.DataSource = objBLL.GetAll("Id DESC")
        GridView1.DataBind()
    End If

Så her jeg 3 metoder til sortering og paging :

    Public Function SortOrder(ByVal Field As String) As String
        If Field = ViewState("SortOrder").ToString() Then
            SortOrder = Replace(Field, "ASC", "DESC")
        Else
            SortOrder = Replace(Field, "DESC", "ASC")
        End If
    End Function

    Protected Sub MyGridView_Page(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
        GridView1.PageIndex = e.NewPageIndex
        objBLL.GetAll(ViewState("SortOrder").ToString())
    End Sub

    Protected Sub MyGridView_Sort(ByVal sender As Object, ByVal e As GridViewSortEventArgs)
        GridView1.PageIndex = 0
        objBLL.GetAll(SortOrder(e.SortExpression.ToString()))
    End Sub

men af en eller anden årsag får jeg en fejl der lyder på :

    Object reference not set to an instance of an object.

og den fremkommer i denne linie :

    If Field = ViewState("SortOrder").ToString() Then

Hvor det er "ViewState("SortOrder").ToString()" der er problemet, jeg tror jeg har stirret mig blid på det så måske der er en der kan hjælpe mig igennem med dette ?

/Websam
Avatar billede websam Nybegynder
08. marts 2006 - 03:12 #1
Jeg glemte lige selve gridview'et :

<asp:GridView ID="GridView1"
              OnSorting="MyGridView_Sort"
              OnPageIndexChanging="MyGridView_Page"
              runat="server"
              AllowSorting="true"
              AllowPaging="True"
              PageSize="10"
              AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id ASC" />
        <asp:BoundField DataField="Name" HeaderText="Navn" SortExpression="Name ASC" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email ASC" />
    </Columns>
</asp:GridView>

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 12:34 #2
et gridview vedligeholder selv sortdirection, så programmering omkring det er ikke nødvendig.
hvis du bruger en objectdatasource kontrol sammen med dit gridview - kan du sådan set sløjfe al den kode du har der.
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 12:40 #3
Hvor/hvordan tilføjer jeg så det henne ?

Husk på at jeg loader mine data ved hjælp af en cached Generic.List til at vise data med, hvis det har nogen betydning.

/Websam
Avatar billede websam Nybegynder
08. marts 2006 - 13:03 #4
Og jeg benytter mig jo af Datalag > Businesslag > Valideringslag > Designlags modellen hvilket gør situationen lidt anderledes så jeg trækker ikke data direkte fra databasen og ud i et gridview'et hvis det er der du vil hen ?

Jeg sender en liste igennem mine lag som så skal præsenteres i et gridview afhængig af hvad der vælges af sorterings mulighed i gridview'et.

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 13:25 #5
det er ikke der jeg vil hen ... her er et eksempel:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PersonsGridView.aspx.cs" Inherits="PersonsGrid" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Databinding til egne typer via ObjectDataSource</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:GridView
        ID="GridView1"
        runat="server"
        DataSourceID="PersonsDataSource"
        AutoGenerateColumns="False"
        DataKeyNames="PersonId"
        AllowSorting="True"
        AllowPaging="true"
        PageSize="2">
        <Columns>         
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
            <asp:BoundField DataField="PersonId" HeaderText="PersonId" SortExpression="PersonId" />
            <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
            <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
            <asp:BoundField DataField="Adresse" HeaderText="Adresse" SortExpression="Adresse" />
            <asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" />
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:BoundField DataField="IsActive" HeaderText="Active" SortExpression="IsActive" />
            <asp:CheckBoxField DataField="IsActive" HeaderText="IsActive" />
        </Columns>
    </asp:GridView>
    <br />
    <asp:ObjectDataSource
        ID="PersonsDataSource"
        runat="server"
        DeleteMethod="DeletePerson"
        InsertMethod="AddPerson"
        SelectMethod="GetAllPersons"
        TypeName="SampleData.PersonAccess"
        UpdateMethod="UpdatePerson"
        SortParameterName="sortExpression" >
        <DeleteParameters>
            <asp:Parameter Name="personId" Type="Int32" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="name" Type="String" />
            <asp:Parameter Name="age" Type="Int32" />
            <asp:Parameter Name="adresse" Type="string" />
            <asp:Parameter Name="city" Type="string" />
            <asp:Parameter Name="country" Type="string" />
            <asp:Parameter Name="isActive" Type="Boolean" />
            <asp:Parameter Name="personId" Type="Int32" />
        </UpdateParameters> 
        <InsertParameters>
            <asp:Parameter Name="name" Type="String" />
            <asp:Parameter Name="age" Type="Int32" />
            <asp:Parameter Name="adresse" Type="string" />
            <asp:Parameter Name="city" Type="string" />
            <asp:Parameter Name="country" Type="string" />
            <asp:Parameter Name="isActive" Type="Boolean" />
        </InsertParameters>
    </asp:ObjectDataSource>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

læg mærke til at du angiver at typename for den klasse du opererer din data med - datasource kontrollen instantierer den selv når det er nødvendigt (med mindre dine metoder er static).

du kan sådan set generere ovenstående fra designeren hvis du blot trækker et gridview ind, og vha. den smarttags der kommer frem beder om at få oprettet en ny datasource. der kan du så vælge en objectdatasource, hvorefter du kan pege på den klasse du vil benytte - og angive select/insert/update og deletemetoderne.

mvh

mvh
Avatar billede websam Nybegynder
08. marts 2006 - 13:47 #6
Ok det fik jeg så lige tjekket af og så får jeg denne fejl når jeg klikker på en af sorterings linkene :

The data source 'ObjectDataSource1' does not support sorting with IEnumerable data. Automatic sorting is only supported with DataView, DataTable, and DataSet.

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 13:54 #7
det er heller ikke automatisk sortering du er ude efter - din selectmetode skal bare kunne kaldes med et sortexpression :

ID="PersonsDataSource"
runat="server"
DeleteMethod="DeletePerson"
InsertMethod="AddPerson"
SelectMethod="GetAllPersons"
TypeName="SampleData.PersonAccess"
UpdateMethod="UpdatePerson"
SortParameterName="sortExpression"

ovenstående fortæller - at der på din dataadgangsklasse skal være en metode der hedder
GetAllPersons
og i og med at der er angivet et SortParameterName

SortParameterName="sortExpression"

fortæller det - at der skal være en metode der hedder GetAllPersons der tager et string argument med navnet sortExpression - altså sådan her:

GetAllPersons(string sortExpression)

og det er så den der står for at returnere det der skal returneres - sorteret ud fra sortexpression.

mvh
Avatar billede websam Nybegynder
08. marts 2006 - 14:09 #8
Så får jeg ingen fejl længere, men jeg kan stadigt ikke sortere. Min gridview ser nu sådan ud :

ID="ObjectDataSource1"
runat="server"
DataObjectTypeName="Newsletter.NewsletterInfo.Info"
DeleteMethod="Delete"
InsertMethod="Create"
SelectMethod="GetAll"
TypeName="Newsletter.NewsletterBLL.Buisness"
UpdateMethod="Update"
SortParameterName="OrderBy"

Og så snakkede du om at det ikke måtte være static metode, mine metoder er af denne type :

VB :
Public Function GetAll(Byval orderby As String)
'
End Function

C# :
public object GetAll(string orderby)
{
}

Hvis det har noget at sige.

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 14:59 #9
det må gerne være statiste metoder - det er der ingen problemer i.

har du AllowSorting="True" + sortexpression i dit gridview (som i det eksempel jeg sendte højere oppe) ?

og returnerer din GetAll(...) en sorteret collection?

mvh
(måske det er nemmest hvis du viser mig din implementering af GetAll(...) + din aspx som den ser ud nu).
Avatar billede websam Nybegynder
08. marts 2006 - 15:07 #10
Metode i datalaget :

Public Function FindAll(ByVal OrderBy As String) As List(Of NewsletterInfo.Info) Implements NewsletterDataInterface.FindAll
    Dim Sql As String = "Select * From tbl_newsletter Order By " & OrderBy & ""
    Dim objComm As DbCommand = LoadCommand(Sql)
    Dim Dr As DbDataReader = objComm.ExecuteReader
    Dim objList As New List(Of NewsletterInfo.Info)
    Do While Dr.Read
        objList.Add(New NewsletterInfo.Info(Convert.ToInt32(Dr("Id")), _
                                                    Convert.ToInt32(Dr("UserLevel")), _
                                                    Convert.ToString(Dr("Name")), _
                                                    Convert.ToString(Dr("Email")), _
                                                    Convert.ToString(Dr("GetLanguage")), _
                                                    Convert.ToString(Dr("Ip")), _
                                                    Convert.ToString(Dr("CheckSum")), _
                                                    Convert.ToDateTime(Dr("TheDate"))))
    Loop
    Dr.Close()
    CloseConnection()
    Return objList
End Function

Metode i Businesslaget (lidt tynd lige nu men der kommer mere på) :

Public Function GetAll(ByVal OrderBy As String) As List(Of NewsletterInfo.Info) Implements NewsletterBLLInterface.GetAll
    Dim Source As List(Of NewsletterInfo.Info)
    Source = objDAL.FindAll(OrderBy)
    Return Source
End Function

GridView i Design lag :

<asp:GridView ID="GridView1"
              runat="server"
              AllowSorting="True"
              AllowPaging="True"
              PageSize="10"
              AutoGenerateColumns="False"
              DataSourceID="ObjectDataSource1"
              DataKeyNames="Id">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Email" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Name" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource
    ID="ObjectDataSource1"
    DataObjectTypeName="Newsletter.NewsletterInfo.Info"
    DeleteMethod="Delete"
    InsertMethod="Create"
    SelectMethod="GetAll"
    TypeName="Newsletter.NewsletterBLL.Buisness"
    UpdateMethod="Update"
    SortParameterName="OrderBy"
    Runat="Server">
</asp:ObjectDataSource>

/Websam
Avatar billede websam Nybegynder
08. marts 2006 - 15:17 #11
Nu får jeg så fejl på min Sql sætning så det kan være der det hele ligger begravet :

    Line 1: Incorrect syntax near 'By'

Men er det ikke rigtigt nok den måde jeg laver den på :

    "Select * From tbl_newsletter Order By " & OrderBy & ""

Det plejer der da ikke at være problemer med ?

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 15:34 #12
kommer du igennem de forventede metoder når du debugger?
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 15:38 #13
jeg lavede den om til :

"Select * From tbl_newsletter Order By '" & OrderBy & "'"

Og så henter den fint data igennem lagene, jeg kan bare ikke sortere efterfølgende.

Og ja der er ikke noget i vejen med metoderne der er fin gennemgang ved select, update, insert og delete.
Avatar billede snepnet Nybegynder
08. marts 2006 - 15:39 #14
og hvad er dine resulterende værdier når du debugger?
(du skal for øvrigt nok sørge for at håndtere det selv, hvis dit sorteringsudtryk er "", hvilket det vil være før du sorterer).
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 15:46 #15
Min "OrderBy" retunere Id ASC ved debug på datalagets metode og dette er ved load af siden så den er ikke tom inden sortering hvorfor der så ikke sker noget når jeg prøver sortering forstår jeg ikke.
Avatar billede snepnet Nybegynder
08. marts 2006 - 16:47 #16
mmm... næh... er elementerne i din liste i forventet rækkefølge?
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 16:49 #17
Ja de bliver sorteret efter id 1, 2, 3, 4, 5 osv....

Jeg fatter ingen ting, men lykkedes det ikke kan jeg jo heldigvis programmere mig ud af det ;o)

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 16:58 #18
og hvad sker der så når du nu trykker på en given header?
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 17:05 #19
Ikke det fjerneste den forbliver blot sorteret efter Id 1, 2, 3, 4, 5 osv....

Men en nem og hurtig løsning på det hele var en simpel dropdown menu der sætter en session med den valgte sorterings rækkefølge, det skal fame ikke tage mig 5 min. at få det lavet *GGG* frem for de mange timer jeg skal bruge på at finde fejl på noget som dette .oO
Avatar billede snepnet Nybegynder
08. marts 2006 - 17:16 #20
hvad sker der i din kode når du sorterer, og du sætter et breakpoint i den metode der tager sorteringsparameteren.
får du den forventede parameter - og genereres den forventede liste.
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 17:37 #21
Hvis jeg sætter et preak point i koden der tager parameteren kan jeg ikke få lov at sortere da den jo ikke får lov at loade siden så det er lidt svært at køre debug på

/Websam
Avatar billede websam Nybegynder
08. marts 2006 - 17:42 #22
Og når jeg debugger i mit business lag får jeg som ventet "" i min OrderBy.

Men som sagt får jeg ikke lov at teste sortering med debug kørende, da siden så ikke loades.

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 19:13 #23
? - ikke forstået .... du sætter et breakpoint. så stopper eksekveringen der, hvorefter du kan steppe igennem koden med F10 og F11 - så kan du se hvad der sker, og hvad dine variable indeholder - og du kan så bare trykke F5 når du ikke gider inspicere mere.
det er bestemt ikke forventet at dit sorteringsudtryk er "" når du har eksekveret en sortering i browseren.
mvh
Avatar billede websam Nybegynder
08. marts 2006 - 21:38 #24
Det ligger i min sql for hvis jeg bare laver en simpel databind :

GridView1.DataSource = objBLL.GetAll("Name ASC")
GridView1.DataBind()

Hvor den jo så vil blive hentet sorteret efter navn så henter den blot i den rækkefølge som det er i databasen, men hvorfor den ikke vil godtage sql'en forstår jeg ikke ?

/Websam
Avatar billede snepnet Nybegynder
08. marts 2006 - 22:27 #25
der er vel kage i din order by clause så .... det er derfor du skal debugge, og se hvad du ender med at fyre efter databasen - der er nok bare noget galt med det udtryk du strikker sammen.
mvh
Avatar billede snepnet Nybegynder
08. marts 2006 - 22:28 #26
mm... kan se dem højere oppe - du skal bare have noget i denne stil:
hvis du ender med en sql der hedder
select * from tbl_newsletter order by name asc
du skal ikke have pling'er om.
mvh
Avatar billede websam Nybegynder
09. marts 2006 - 10:10 #27
Jeg er sikker på at jeg får det til at virke når jeg har styr på den sql så smid et svar så vi kan få lukket denne tråd.

/Websam
Avatar billede websam Nybegynder
09. marts 2006 - 10:11 #28
Kan man forøvrigt lave paging/sorting på en datalist ?

/Websam
Avatar billede snepnet Nybegynder
09. marts 2006 - 10:15 #29
oki.
mvh
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