Avatar billede karsten_larsen Praktikant
05. juli 2007 - 18:53 Der er 38 kommentarer og
1 løsning

Sortering i Gridview via e.SortDirection

Hvorfor virker nedenstående ikke:

            If e.SortDirection = SortDirection.Ascending Then
                m_DataView.Sort = e.SortExpression & " " & "ASC"
            End If
            If e.SortDirection = SortDirection.Descending Then
                m_DataView.Sort = e.SortExpression & " " & "DESC"
            End If

Den afvikles hele tiden som "Asc"

Afvikles i Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs)

??:-)karsten_larsen
Avatar billede neoman Novice
05. juli 2007 - 23:31 #1
ændrer SortDirection sig i handleren ? Og du binder dataviewet til gridviewet?
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 08:26 #2
Hvordan tjekker jeg at SortDirection ændre sig?

Jeg har prøvet tre forskellige tilgange til dette se nedenfor:


            If (numberDiv Mod 2) = 0 Then
                m_DataView.Sort = e.SortExpression & " " & "ASC"
            Else
                m_DataView.Sort = e.SortExpression & " " & "DESC"
            End If
            numberDiv = numberDiv + 1


            If e.SortDirection = SortDirection.Ascending Then
                m_DataView.Sort = e.SortExpression & " " & "ASC"
            End If
            If e.SortDirection = SortDirection.Descending Then
                m_DataView.Sort = e.SortExpression & " " & "DESC"
            End If

            myDataGrid.DataSource = m_DataView
            myDataGrid.DataBind()
        End If
    End Sub

2) hvor sorteringsretning blev fundet via en funktion
    ' SorteringRetning
    Private Function ConvertSortDirectionToSql(ByVal sortDireciton As SortDirection) As String
        Dim newSortDirection As String = ""

        Select Case sortDireciton
            Case SortDirection.Ascending
                newSortDirection = "ASC"
                Exit Select
            Case SortDirection.Descending
                newSortDirection = "DESC"
                Exit Select
        End Select
        Return newSortDirection
    End Function

    Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs)
        Dim m_DataTable As DataTable = TryCast(myDataGrid.DataSource, DataTable)

        If m_DataTable IsNot Nothing Then
            Dim m_DataView As New DataView(m_DataTable)

            m_DataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection)

            myDataGrid.DataSource = m_DataView
            myDataGrid.DataBind()
        End If
    End Sub

3) har været denne


Public Shared numberDiv as integer

    Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs)
        Dim m_DataTable As DataTable = TryCast(myDataGrid.DataSource, DataTable)

        If m_DataTable IsNot Nothing Then
            Dim m_DataView As New DataView(m_DataTable)

          if (numberDiv Mod 2) = 0
              m_DataView.Sort  = e.SortExpression & " " & "ASC"
          Else
              m_DataView.Sort  = e.SortExpression & " " & "DESC"
          End If
          numberDiv = numberDiv + 1

            myDataGrid.DataSource = m_DataView
            myDataGrid.DataBind()
        End If
    End Sub

??:-) karsten_larsen
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 08:29 #3
ups - en skrive fejl

løsning 1) som overstående, hvor koden bliver
    Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs)
        Dim m_DataTable As DataTable = TryCast(myDataGrid.DataSource, DataTable)

        If m_DataTable IsNot Nothing Then
            Dim m_DataView As New DataView(m_DataTable)

            If e.SortDirection = SortDirection.Ascending Then
                m_DataView.Sort = e.SortExpression & " " & "ASC"
            End If
            If e.SortDirection = SortDirection.Descending Then
                m_DataView.Sort = e.SortExpression & " " & "DESC"
            End If

            myDataGrid.DataSource = m_DataView
            myDataGrid.DataBind()
        End If
    End Sub
Avatar billede neoman Novice
06. juli 2007 - 08:33 #4
Øh - og resultatet af alle disse anstrengelser var hvad ?

Jeg ville have testet ved blot at steppe igennem handleren med debuggeren.

Din handler bliver kaldt i det hele taget ? Har du autowireup="true" i page directive ? For ellers mangler der vel en "Handles" clause
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 08:46 #5
Resultet: hovedpine :)

AutoEventWireup="true" er sat

Hvordan steppe igennem handleren med debuggeren - det fif kender jeg ikke.
Avatar billede neoman Novice
06. juli 2007 - 08:55 #6
gå ind i kode vinduet
på den grå vertikale bjælke yderst til venstre i vinduet  klik med musen
så får du en brun "klat"
start debugging
koden vil nu stoppe på "klatten"
tryk på STEP OVER i debug menuen (som burde dukke op af sig selv)
på den måde kan du steppe gennem kodens linjer, og se værdierne for variablerne ved at holde musen over dem
Avatar billede neoman Novice
06. juli 2007 - 08:58 #7
og dit gridview har i sourcen OnSorting defineret som din handler ?
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 09:03 #8
"klatten" er sat - debuggen kører direkte igennem. Der er ingen fejl i Error list
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 09:06 #9
Her er det hele "renskrevet"

Fra aspx filen
            ID="myDataGrid"
            OnPageIndexChanging="gridView_PageIndexChanging" 
            OnSorting="myDataGrid_Sorting"
            runat="server"
            AllowSorting="True" 
            AllowPaging ="True"
            PageSize="2">
        </asp:GridView>

Fra codebehind:

Protected Sub myDataGrid_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles myDataGrid.Sorting

        Dim Connection = New System.Data.SqlClient.SqlConnection
        Connection.ConnectionString = ConfigurationManager.ConnectionStrings("DemoCrypt").ConnectionString

        Dim strSQLCountryCreate As String
        strSQLCountryCreate = "SELECT FirstName, LastName, CryptFirstName FROM DemoCrypt"
        Dim Command As New System.Data.SqlClient.SqlCommand(strSQLCountryCreate, Connection)

        Connection.Open()

        Dim ds As DataSet = New DataSet()
        Dim da As New SqlDataAdapter()

        da.SelectCommand = Command
        da.Fill(ds, "tbDemo")

        For Each workRow As DataRow In ds.Tables(0).Rows
            Dim encryptedString As String
            encryptedString = CType(workRow(2), String)
            workRow(2) = Decryptering(encryptedString)
        Next

        Dim Retning As String = ""
        If e.SortDirection = SortDirection.Descending Then
            Retning = "Desc"
        End If
        If e.SortDirection = SortDirection.Ascending Then
            Retning = "Asc"
        End If

        Dim myView As DataView
        myView = ds.Tables("tbDemo").DefaultView
        myView.Sort = e.SortExpression + " " + Retning

        myDataGrid.DataSource = ds.Tables("tbDemo").DefaultView
        myDataGrid.DataBind()
    End Sub


Det burde da være rigtigt - ikk?
Avatar billede neoman Novice
06. juli 2007 - 09:07 #10
hvis den kører igennem, så betyder det at din handler slet ikke bliver kaldt. Det kan du overbevise dig selv om ved også at tilføje f.eks. MsgBox("Been here") i en linje i handleren. Hvis du ikke får nogen pop-up på din skærm, tjah - så kører handleren ikke. (MsgBox duer kun hvis du udvikler lokalt - ellers brokker den sig):)
Avatar billede neoman Novice
06. juli 2007 - 09:10 #11
øh 10 sec - skal lige tænke over koden. Men nu har du HAndles clause på - så er vel Autowireup=false ? Ellers kunne jeg forestille mig at den kørte to gange:)
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 09:15 #12
Uanset om AutoEventWireup="true" eller AutoEventWireup="false" så kommer pop up med "Asc"

        Dim Retning As String = ""
        If e.SortDirection = SortDirection.Descending Then
            Retning = "Desc"
            MsgBox("Been here: Desc")
        End If
        If e.SortDirection = SortDirection.Ascending Then
            Retning = "Asc"
            MsgBox("Been here: Asc")
        End If

Måske brugen af e.SortDirection = SortDirection.Descending er forkert eller hur?
Avatar billede neoman Novice
06. juli 2007 - 09:16 #13
Hmm skal der ikke stå :
    myDataGrid.DataSource = myView
        myDataGrid.DataBind()

ellers kan jeg ikke umiddelbart se noget mistænkeligt.

Stadig - hvis din debugger ikke stopper på det break point, så prøv at flytte break pointet til et sted hvor den med SIKKERHED kommer forbi - altså ikke inden i noget IF, men før. Hvsi den stadig ikke stopper, så bliver din handler slet ikke kaldt - og det kan jeg ikke helt se hvorfor skulle ske lige nu
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 09:17 #14
Jeg har også kigget på http://www.eksperten.dk/spm/659329, som har samme problem, men en anden må at finde retning på. Min løsning 3, men der ændrede numberDiv sig ikke.
Avatar billede neoman Novice
06. juli 2007 - 09:19 #15
Prøv at få debuggeren op at køre - det er nok den hurtigste måde. Når man trykker på STEP OVER, så udover værdierne kan man se hvilke linjer koden gennemløber: ret værdifuldt for at se om man hopper ind i nogle betingede blokke af kode eller ej.
Avatar billede neoman Novice
06. juli 2007 - 09:22 #16
Ah ok - så du kommer ind i handleren. Så du har med andre ord en uændret værdi for sort.direction... BRB
Avatar billede neoman Novice
06. juli 2007 - 09:32 #17
Ok - har gogolet, og andre har samme problem som dig. Tilsyneladende kan GridView ikke af sig selv huske hvad den lavede inden postback, og således ændres SortDirection ikke. Den bypass-opeation folk laver er at huske værdien i sessionstate eller viewstate.

Her et eksempel:
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {

        String exp = e.SortExpression;
        String se = (String)Session[exp];
        if (se == null) { Session[exp] = "ASC"; se = "ASC"; }

        if (se.Equals("ASC"))
        {
            Session[exp] = "DESC";
            exp = exp + " ASC";
        }
        else
        {
            Session[exp] = "ASC";
            exp = exp + " DESC";
        }

        Session["MySortExp"] = exp;
        DoBind();

/// bin
Avatar billede neoman Novice
06. juli 2007 - 09:36 #18
og din løsning 3 vil jo ikke køre, da numberDiv jo starter forfra på hver postback, medmindre du gemmer den et sted, f.eks. i session eller viewstate
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 11:01 #19
hmm - jeg prøver lige det med session. Det med debugger lyder rigtigt, rigtigt smart - gad vide om  det fordi jeg køre Vs+Vs1+ VistaVs.
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 11:46 #20
så fik jeg det løst via session

        numberDiv = CType(Session("Retning"), Integer)
        If (numberDiv Mod 2) = 0 Then
            myView.Sort = e.SortExpression & " " & "ASC"
        Else
            myView.Sort = e.SortExpression & " " & "DESC"
        End If
        Session("Retning") = numberDiv + 1

Session("Retning")sættes til 0 i postback=false

neomann vil du lave et svar og mange tak for hjælpen
:-)  karsten_larsen
Avatar billede neoman Novice
06. juli 2007 - 11:59 #21
Det var så lidt.

Har du fået debuggeren op at køre ? det er jo en alletiders ting. Måske havde du fået sat den break point inde i en IF som ikke blev eksekveret, og det var derfor koden ikke stoppede der.
Avatar billede neoman Novice
06. juli 2007 - 12:01 #22
Man kan sætte break points all over the place - du kunen sætte nogle i PageLoad, og se så hvordan det hele funker.
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 12:29 #23
Har prøvet følgende:

Sat "brun prik" forskellige steder i koden (codebehind) og kørt både Step into (F11) og Step over (F10). Det næste om sker der åbnes en browser med applikationen.

Der kommer ikke noget seperat vindue op ej heller et sted, hvor man kan se de løbende værdier.

Er det rigtigt forstået at man kan se værdierne blive behandlet i en s applikation mens man tester den. Det vil være ret cool.

nåh - men tak for hjælpen, btw gav dig karma oveni
:-) karsten_larsen
Avatar billede neoman Novice
06. juli 2007 - 12:37 #24
Browseren skal åbne normalt , fordi applikationen kører normalt.

Du starter applikationen normalt,ved at trykke på den grønne pil. Så kører den indtil det sted i koden hvor break point er sat. PÅ det tidspunkt kan du så steppe igennem koden.. eller trykke på CONTINUE og så kører koden enten til enden, eller til den næste break point.

Den linje koden stoppede er markeret med gult (ganske  som ved en fejl) i kodevinduet - det normale vindue du editerer kode i! Variabel værdierne kan inspiceres ved at holde musen over dem, ganske som ved normal debug når skidtet er stoppet der ved en fejl.

Tak for karma.. men vil hellere høre at det er lykkedes for dig med debuggeren !:)
Avatar billede neoman Novice
06. juli 2007 - 12:39 #25
..og det bedste er at man kan sætte/fjerne break points mens man kører, hvilket er nyttigt hvis man har sat en break point inde i en loop som kører 100 gange, og ikke gider se på det 100 gange :)
Avatar billede neoman Novice
06. juli 2007 - 12:43 #26
og btw : STEP OVER betyder at man går til den næste linje i koden, mens STEP INTO gør, at hvis du f.eks. har et funktionskald, så stepper du IND I funktionen, mens STEP OVER  tager dig til den næste linje i den kode hvor funktionen bliver kaldt, men uden at gå ind i selve funktionen.
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 13:08 #27
hmm - et lille eksempel


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Page.IsPostBack = False Then
            label1.text = Now.Date.ToString
        End If
    End Sub

    Sub ShowTime()
        Response.Write(Now.Date.ToString & "<br>")
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Page.IsPostBack = True Then
            Dim i As Integer = 0
            For i = 0 To 1000
                ShowTime()
            Next
        End If
    End Sub

og prikken sættes foran  Showtime()

Så bør StepOver gøre at der ikke komme 1000 linier med klokken. Er der korrekt forstået?
Avatar billede neoman Novice
06. juli 2007 - 13:12 #28
Nope.. Tror ikke den tillader dig at sætte break point udfor en deklaration.

Prøv at sætte break point ud  for IF i
      If Page.IsPostBack = False Then
            label1.text = Now.Date.ToString
        End If

og hvis den ikke tillader det, så ud for
label1.text = Now.Date.ToString

og så burde den stoppe der ved postback. Når du så trykker på STEP OVER, så vil den steppe igennem PageLoad, og derpå, ved næste STEP OVER, vil den så ryge ind i din Button1_Click
Avatar billede neoman Novice
06. juli 2007 - 13:14 #29
nårh ja sorry - så lige et forkert sted .) ... derinde kan du sagtens sætte den... og så får du lov til at trykke 1000 gange på STEP OVER for at komme videre, medmindre du sletter break pointet efter de første par gange
Avatar billede neoman Novice
06. juli 2007 - 13:15 #30
og STEP OVER vil resultere i at der kommer 1000 linjer med klokken. !!!!

STEP INTO /STEP OVER er kun et spørgsmål om hvor DU ønsker at være i koden - koden eksekveres stadig på ganske normal vis.
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 14:28 #31
Hverken prik foran if eller label gør nogen forskel. Det må være versionen af VS der spiller ind her. Køre VS i Vista Ul det må være det som gør det. Ud over VS SP1 er der et seperat SP til Vista for VS. Idet den debugger hurtigere i dette OS end xp pro. Vil lige prøve i aften i XP.

Det lader til der er nogle problemer med det - dog den anden vej rundt http://support.microsoft.com/kb/325118 :)
Avatar billede neoman Novice
06. juli 2007 - 14:43 #32
lyder mystifistisk - og din kode er compilet med debug=true ?
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 17:48 #33
yes

aspx:
<%@ Page Language="VB" AutoEventWireup="true" Debug ="true"  CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            <asp:Button ID="Button1" runat="server" Text="Button" /></div>
    </form>
</body>
</html>


og codebehind

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Page.IsPostBack = False Then
            label1.text = Now.Date.ToString
        End If
    End Sub

    Sub ShowTime()
        Response.Write(Now.Date.ToString & "<br>")
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Page.IsPostBack = True Then
            Dim i As Integer = 0
            For i = 0 To 1000
                ShowTime()
            Next
        End If
    End Sub
End Class

med prik foran if og label i Page_Load.


ja - det er lidt underligt
Avatar billede neoman Novice
06. juli 2007 - 18:10 #34
hos mig virker en kopi af din kode og stopper som den skal. så det er sikkert en eller anden Vista-feature:)
Avatar billede karsten_larsen Praktikant
06. juli 2007 - 22:46 #35
Ja - det virker fint i XP Pro - en nice feature - men i Vista Ultimate virker det ikke :(

Det er sikkert det, som hører under Wauv-effekten i Vista :)
Avatar billede neoman Novice
06. juli 2007 - 23:59 #36
Nåååh ja... %&¤#"%¤-effekten  :-)
Avatar billede neoman Novice
07. juli 2007 - 00:02 #37
Avatar billede karsten_larsen Praktikant
07. juli 2007 - 01:09 #38
okay - det må prøves i morgen.
Avatar billede karsten_larsen Praktikant
08. juli 2007 - 11:26 #39
neomann -> som kom den feature også i Vista. Det er virkelig cool feature. Laver lige et sp. til dig med p., da det var ud over det 1. sp.

:-) karsten_larsen
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