05. juli 2007 - 18:53Der 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)
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)
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
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
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
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
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):)
ø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:)
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?
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
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.
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.
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"; }
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.
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
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 !:)
..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 :)
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.
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?
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
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
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.
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
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
Synes godt om
Ny brugerNybegynder
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.