Avatar billede karsten_larsen Praktikant
12. juni 2007 - 09:51 Der er 7 kommentarer og
1 løsning

Sortering af Gridview når data er krypteret

Hvordan opnåes sortering af et Gridview, når data hentes fra database, hvor de er krypteret.

SortExpression acceptere ikke en funktion på parameter. f.eks. '<%# Decrypt(Eval("Navn")) %>'

Bruger følgende kode:
               
<asp:TemplateField SortExpression="Navn" HeaderText="Navn" >
<ItemTemplate>
<asp:LinkButton ID="LnkBtnNavn" CssClass="txt_12" Width="300px" runat="server" CausesValidation="False" CommandName="Select" Text='<%# Decrypt(Eval("Navn")) %>'></asp:LinkButton>
</ItemTemplate>
<HeaderStyle Height="20px" HorizontalAlign="Center"  />
</asp:TemplateField>   

??:-) karsten_larsen
Avatar billede neoman Novice
12. juni 2007 - 11:24 #1
Dette har jeg sakset fra:
http://quickstart.developerfusion.co.uk/QuickStart/aspnet/doc/data/databases.aspx

The SqlDataSource control supports sorting when its DataSourceMode property is set to "DataSet". To enable the sorting UI in the GridView, set the AllowSorting property to true. This causes the GridView to render link buttons for its column headers that can be clicked to sort a column. The GridView control passes the SortExpression associated with the column field to the data source control, which returns the sorted data to the GridView.

The SortExpression syntax expected by SqlDataSource is the same syntax as the Sort property of System.Data.DataView, although other data sources might support a different syntax. Because the sorting behavior of SqlDataSource relies on the underlying DataView Sort property, sorting is only supported by SqlDataSource when in DataSet mode; if set to DataReader mode, sorting will be disabled. Typically you will set the SortExpression to a single field name associated with a column of the GridView. The GridView automatically alternates between appending "ASC" or "DESC" to the SortExpression on each click, to toggle between ascending and descending sort order.
--------

I hht ovenstående, så foretages sorteringen direkte i det underliggende dataset, som du jo ikke ændrer i, ved at anvende Decrypt(Eval("Navn")) osv.

Den nærliggende tanke er vel at erstatte de krypterede værdier i datasettet med de dekrypterede, eller klone datasettet og deri foretage erstatningen. Plan B kunne være, at komme med sin egen sort-algoritme, men jeg ved hvad JEG ville vælge :-)

Måske har andre et bedre bud.
Avatar billede karsten_larsen Praktikant
12. juni 2007 - 12:02 #2
hmm - hvordan erstatte værdier i datasettet eller klone datasettet?
Avatar billede neoman Novice
16. juni 2007 - 14:07 #3
Cloning: http://msdn2.microsoft.com/en-us/library/system.data.dataset.clone(vs.80).aspx

Og erstatte ? Løbe igennem datasettets rækker, eller det clonede datasets rækker:

for each workRow as datarow in ds.Tables[0].Rows
  dim encryptedString as string

  encryptedString = Ctype(workRow(x),string)
  workRow(x) =  Decrypt(encryptedString)
next

og derpå binde til gridview - så skulle sorteringen gerne virke.

Hvis du ikke ønsker at gøre dette, så kan du f.eks. også implementere noget custom sorting på objekter ved hjælp af noget Comparer... Et eksempel herpå er begravet ret dybt inde i  http://www.asp.net/downloads/starterkits/TimeTracker.aspx?tabid=62
Avatar billede karsten_larsen Praktikant
19. juni 2007 - 07:05 #4
neomann -> har prøvet på forskellig vis de sidste par dage, men har stadig problemer med sortering - der sker intet.

Kan du gennemskue det? her er min kode:

Aspx-side:

<asp:gridview
id="GridViewCrypt"
autogeneratecolumns="true" 
AllowSorting="true" 
OnSorted="GridView_Sorted"
runat="server">
</asp:gridview>

Codebehind:

'Forbind data til Gridview og dekrypter DataSet
    Sub dbGridviewNumber()
        If Not IsPostBack Then
            Dim SqlString As String = "SELECT [CryptId], [Name] FROM [CryptDemo]"
            Dim ds As DataSet = GetData(SqlString)
            If (ds.Tables.Count > 0) Then
                ' Dekryptering af DataSet
                For Each workRow As DataRow In ds.Tables(0).Rows
                    Dim encryptedString As String
                    encryptedString = CType(workRow(1), String)
                    workRow(1) = Decryption(encryptedString)
                Next
                GridViewCrypt.DataSource = ds
                GridViewCrypt.DataBind()
            Else
                Label1.Text = "Kan ikke forbinde til demodatabase"
            End If
        End If
    End Sub
   

'Hent data til DataSet
Function GetData(ByVal SQLString As String) As DataSet
        Dim connectionString As String = ConfigurationManager.ConnectionStrings("Demo").ConnectionString
        Dim ds As New DataSet()
        Try
            Dim connection As New SqlConnection(connectionString)
            Dim adapter As New SqlDataAdapter(SQLString, connection)
            adapter.Fill(ds)
        Catch ex As Exception
            Label1.Text = "Kan ikke forbinde til demodatabase"
        End Try
        Return ds
    End Function
   

' Sorter Gridview
Protected Sub GridView_Sorted(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridViewCrypt.Sorted
        dbGridviewNumber()
    End Sub



??:-) karsten_larsen
Avatar billede neoman Novice
19. juni 2007 - 18:38 #5
jeg tror jeg ikke har helt læst på lektien selv, og deraf dine problemer.

Så vidt jeg forstår systemet, så er en DataSource "smart" nok til at vide hvad man skal gøre, hvis man ønsker at sortere, og derfor implementere alt det her DataView hurlumhej som er nødvendigt.

Hvis du blot står med et dataset, så hænger du nok selv på implementering af noget sorting. Jeg tror at det er derfor at du viser Protected Sub GridView_Sorted(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridViewCrypt.Sorted

den brokkede sig sikkert over at den handler manglede:)

Jeg beklager, men jeg tror vejen frem er at hitte en sort algoritme derude på google - og jeg har en grum mistanke om, at du selv kan gøre det mindst lige så godt som jeg :)
Avatar billede karsten_larsen Praktikant
19. juni 2007 - 18:51 #6
neomann

Det går nok - men der må da være andre som har alle data krypteret - ellers står det da skidt til.

Jeg har google frem og tilbage og fandt ikke lige et dejlig "to-do-link" - men jeg leder videre.

Vil du lave et svar for hjælpen ind til videre.

:-) karsten_larse
Avatar billede neoman Novice
19. juni 2007 - 19:26 #7
nope .. har jo ikke hjulpet dig en disse. Der findes mange links til "custom paging" - det er jo der hunden har begravet sin humle. Når du finder en løsning, så plz del den med os andre her :)
Avatar billede karsten_larsen Praktikant
05. juli 2007 - 18:56 #8
Løsningen er at benytte et dataview og forinden havde lavet et nyt dataset, som der kan sorteres i.

Kode eksempel kan ses her http://community.strongcoders.com/content/CSGridViewSortingPaging.aspx

Sp. har en fortsat tråd her: http://www.eksperten.dk/spm/786388
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