Hej, Om du inte fyller din tdsChemical varje gång i PageLoad eller sparar den i Viewstate eller nåt liknande så skulle jag tro att du måste fylla din tdsChemical före du gör sorteringen igen. Skulle tro att det är det som är problemet. Hej, Ditt Dataset dör när sidan skickas ut till klienten, om du inte explicit sparar det (det hjälper inte att det är globalt.. jo som global Application-variabel då men det rekommenderas inte..) Precis som Ola skriver måste du hantera state i din ASP.NET applikation, förutom de varianter som Ola nämner (Session, ViewState) så finns ju bland andra även Application och Cachning av data. Hittade en kort beskrivning av lite olika varianter här: http://www.extremeexperts.com/Net/FAQ/StateManagementInASPNET.aspx. Sen om du bara "googlar" efter typ ASP.NET och state management så lär du få i princip hur många träffar som helst som kan hjälpa dig. Sorteringsproblem
Jag vet att frågan dykt föör och jag har sökt, men hittar ingen lösning på mitt problem.
På mitt formulär söker man efter kemikalier. När man klicka på sökknappen fylls en DataGrid med resultatet. Denna DataGrid vill jag sedan kunna sortera, men får det inte att funka.
Jag har satt "allowsorting" till true.
OnclickEventet(den som fyller datagriden) ser ut så här:
<b>tdsChemical</b> är deklarerad längst upp i klassen.
Private Sub loadChemicals()
Dim dvChemical As DataView
Dim objFacade As Facade_Services.fcdMaintainChemical
Try
objFacade = New Facade_Services.fcdMaintainChemical
'Create dataset
tdsChemical = objFacade.getAllChemicals()
dvChemical = tdsChemical.Tables(0).DefaultView
'Chemical Name column
Dim sName As New BoundColumn
sName.DataField = "chemical_name"
sName.SortExpression = "chemical_name"
sName.Visible = True
sName.HeaderText = "Name"
sName.HeaderStyle.ForeColor = System.Drawing.Color.White
sName.ItemStyle.Width.Pixel(140)
sName.HeaderStyle.CssClass = "ListHeader"
dgSearchResult.Columns.AddAt(0, sName)
sName = Nothing
'Cas No column
Dim sCasNo As New BoundColumn
sCasNo.DataField = "cas_no"
sCasNo.SortExpression = "cas_no"
sCasNo.Visible = True
sCasNo.HeaderText = "CAS No"
sCasNo.HeaderStyle.ForeColor = System.Drawing.Color.White
sCasNo.ItemStyle.Width.Pixel(100)
sCasNo.HeaderStyle.CssClass = "ListHeader"
dgSearchResult.Columns.AddAt(1 sCasNo)
sCasNo = Nothing
'Mol Formula column
Dim sMolFormula As New BoundColumn
sMolFormula.DataField = "mol_formula"
sMolFormula.SortExpression = "mol_formula"
sMolFormula.Visible = True
sMolFormula.HeaderText = "Mol formula"
sMolFormula.HeaderStyle.ForeColor = System.Drawing.Color.White
sMolFormula.ItemStyle.Width.Pixel(100)
sMolFormula.HeaderStyle.CssClass = "ListHeader"
dgSearchResult.Columns.AddAt(2, sMolFormula)
sMolFormula = Nothing
dgSearchResult.DataSource = dvChemical
dgSearchResult.DataBind()
dgSearchResult.Visible = True
'Manage exceptions
Catch eRuntime As Exception 'Runtime error in this method (unknown)
'Lite felhantering...
Finally
objFacade = Nothing
If Not IsNothing(tdsChemical) Then tdsChemical.Dispose()
tdsChemical = Nothing
End Try
End Sub
Sen har jag lagt följande på "sortcommandet" för datagriden:
Private Sub dgSearchResult_SortCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)
Handles dgSearchResult.SortCommand
Dim SortView As DataView
SortView = tdsChemical.Tables(0).DefaultView
SortView.Sort = e.SortExpression
dgSearchResult.DataSource = SortView
dgSearchResult.DataBind()
End Sub
När jag klickar på en rubrik blir datgriden tom.
Är det något mer jag behöver göra, eller har jag gjort något fel??
/Jocke
Sv: Sorteringsproblem
Går att lösa på lite snyggare sätt så att du slipper anropa databasen varje gång du postar om sidan men det borde lösa problemet du har i nuläget iaf.Sv:Sorteringsproblem
Jag skapar ju mitt dataset "globalt" längst upp på sidan. Sen binder det till datagriden vid knapptryckningen.
Borde inte det vara tillängligt i sortcommandet då?
Hur skulle en snyggare lösning se ut menar du? Jag har ganska gott om tid med detta, så jag kan göra om det om det finns något bättre/snyggare sätt.
/JockeSv: Sorteringsproblem
Du kan spara det i session, viewstate, eller slå upp i databasen igen.
Du bör inte spara i session eller viewstate om det är väldigt mycket data, då är det bättre att gå till databasen igen.
Gör en RefreshData() metod som du anropar vid första laddningen av sidan men ÄVEN vid sort command (först). Du kan senare bestämma vad som ska hända i RefreshData() alltså slå upp i databasen eller hämta från Viewstate.Sv:Sorteringsproblem
Som Ola också skriver bör man undvika viewstate om det är stora mängder data men jag tänkte ändå visa hur du kan göra i ditt fall för att på ett smidigt sätt spara undan ditt dataset i Viewstate. Om du lägger till följande kod på din sida så borde det funka bra.
<code>
#Region "Viewstate Handling"
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
Dim values() As Object = DirectCast(savedState, Object())
If Not savedState Is Nothing Then
MyBase.LoadViewState(values(0))
tdsChemical = DirectCast(values(1), DataSet)
End If
End Sub
Protected Overrides Function SaveViewState() As Object
Dim values(1) As Object
values(0) = MyBase.SaveViewState()
values(1) = tdsChemical
Return values
End Function
#End Region
</code>
Den här koden kan du sen enkelt utöka om det är fler variabler eller objekt som du vill behålla mellan postningar av sidan.
EDIT: Nine Options for Managing Persistent User State in Your ASP.NET Application --> http://msdn.microsoft.com/msdnmag/issues/03/04/ASPNETUserState/default.aspx