Tjena, Du ha en klass som heter ViewState som är lämplig för detta. Det är väl frågan om det är klyftigt att lägga ett helt DataSet i Viewstate? Med tanke på att det helt plötsligt blir mycket mer som skickas till klienten. Det smartaste är nog att läsa in datan på nytt. Tjena! Hmm intressanta kommentarer. Smidigt att använda datatable istället för dataset. Faktum är att hur jag fixar till exakt det faktiskt är en hemlis :-) Skrev ihop några klasser och det verkar onekligen smart, om det nu är så här du menar Mickael? .Om någon vill ta del av dem så postar jag koden här under. Dock utan parametrar och db-wrapper stuff. Hmm skulle inte sitta helt fel med någon artikel om detta. Jag binder lite data till en datagrid och skulle försöka med att Update/Delete/Add, vilket resulterar i bedtydligt mera jobb än vanliga sql satser.Hur behåller man värden från medlemmar i codebehind-klassen
I klassen för min codebehind sida har jag skapat ett privat fält som jag vill lagra lite data i:
private DataSet ds; //The DataSet to store the xml data in
När sidan laddas fyller jag datasetet med data. Nästa gång sidan laddar om verkar det som om allt data har försvunnint.
Hur kan jag få ds att behålla sitt värde även fast man laddar om sidan? Eller måste jag helt enkelt fylla ds varje gång sidan laddas?Sv: Hur behåller man värden från medlemmar i codebehind-klassen
Så du kan göra såhära
i Page_Load metoden.
if(!IsPostBack) //detta är första gången sidan visas.
{
ds = new DataSet();
/* initialisera ds */
ViewState["ds"] = ds;
}
else
{
ds = ViewState["ds"];
}
/AndreasSv: Hur behåller man värden från medlemmar i codebehind-klassen
Ett alternativ är att lägga datasettet i cachen, dvs System.Caching.Cache-klassen.
/MSv: Hur behåller man värden från medlemmar i codebehind-klassen
Jag vet att tråden är löst men kunde ändå inte hålla mig från att lägga min stora näsa i blöt :-)
Som vanligt finns det inga korrekta svar på den fråga du ställer utan man får liksom kolla lite på vad du ska använda din data till och framför allt hur mycket data du egentligen behöver ha "konsistent" mellan olika sidor.
Jag skulle vilja illustrera det hela med ett konkret och kanske inte helt ovanligt exempel nämligen "lista och detalj". Exemplet är en lista med CD-skivor där ett klick ska ge uppgifter om en skiva.
Eftersom det är bra at visa alla skivor i en lista så väljer jag att binda innehållet i en datatable till en datagrid på den ena sidan. Jag ser till att det finns en länk i en kolumn, som dessutom innehåller skivans ID i databasen.
Detta sköts som sagt med databinding och eftersom jag tror mig veta att skivdatabasen inte uppdateras väldigt ofta så låter jag den bundna datan vara konsistent mellan postbacks.
<code>
if not page.ispostback then
dt = GetTheCDList()
grdCDs.DataSource = dt
' osv
grdCDs.DataBind()
end if
</code>
Datat ligger då i viewstate (eller i datagridden om man så vill).
På detaljsidan ska allt kunna ändras eller tas bort.
Då behöver vi färsk och fin data för att det inte ska bli problem vid uppdateringen.
Åter binder jag kontrollerna som ska visa upp värden och i detta fall är det textboxar. Genom att enableviewstate är default behöver jag inte bry mig om det och behöver bara mata in det som ska vara i textboxarna.
<code>
If not page.ispostback then
dt = GetDataForOneCD(cdID)
txtCDName.text = dt(0)("cdName")
' osv
end if
</code>
Databind behöver jag heller inte göra.
Nu kan användaren ändra som han eller hon vill och när sedan knappen uppdatera klickas på utförs följande lilla kodstump.
<code>
' hämta ny fin fräsch data
dt = GetDataForOneCD(cdID)
' tabellen uppdateras med ALLA värden
dt(0).("cdName") = txtCDName.text
dt(0).("cdRating") = txtCDRating.text
' spara till databas
Dim myDataTools as new MikaelsDataTools.CDs()
myDataTools.SaveCD(dt)
' Återvänd till startsidan.
</code>
Genom denna hantering garanteras inte datakonsistens om du har högra krav men uppdateringar och liknande är mycket smidigt.
Naturligtvis kan du ju också byta ut en datatable mot ett dataset eller kanske också en datarow.
//Mikael.NETSv: Hur behåller man värden från medlemmar i codebehind-klassen
Hur ser uppdateringen sedan ut i Dataklassen. Du skickar in datatabeln, hur gör du sedan? En vanlig Update sats där du plockar ut värderna igen eller finns det någon bra inbyggd funktion för detta?
Ett annat sätt är ju att skicka in id/värde1/värde2 till klassen och göra uppdateringarna utifrån detta.Sv: Hur beh&#229;ller man v&#228;rden fr&#229;n medlemma
Nejmen allvarligt, det kan jag inte berätta.
Dock kan jag peka in dig mot att själv tillverka en verktygslåda för uppdatering och hämtning av data eftersom den kan återanvändas. Kolla speciellt på CommandBulider och på metoden Update på Command-objektet.
Visst är det smidigt med en datatable MEN(!!!) en datatable är inte serialiserbar och kan inte omvandlas till XML så du kan bara skicka dt eller datarows om du har både affärslogik och din webserver på samma maskin.
<edit>
Det var en sak till. Om du ska gå vidare mot typade datasets så kan du inte använda en datatable.
</edit>
//Mikael.NETSv: Hur beh&amp;#229;ller man v&amp;#228;rden fr&amp;#22
<code>
Imports Microsoft.Data.Odbc
Public Class DataAccessVer2
'Get settings from web.config
Private strCnnString As String = ConfigurationSettings.AppSettings("CnnString")
'Connection properties
Dim objCnn As New OdbcConnection(strCnnString)
Dim objAdapt As New OdbcDataAdapter()
Dim objCmdBuilder As New OdbcCommandBuilder(objAdapt)
Public Function CreateCommand(ByVal strSql As String)
Dim SqlCmd As New OdbcCommand(strSql, objCnn)
Return SqlCmd
End Function
Public Function GetDataTable(ByVal strSql As String)
Try
Dim dt As New DataTable()
objCnn.Open()
objAdapt.SelectCommand = CreateCommand(strSql)
objAdapt.Fill(dt)
Return dt
Catch Exp As OdbcException
' Thow exeption
Finally
objCnn.Close()
End Try
End Function
Public Function SaveDataTable(ByVal dt As DataTable)
objCnn.Open()
objAdapt.Update(dt)
objCnn.Close()
End Function
End Class
</code>
<code>
Imports System
Public Class Data ' The data-class
Inherits DataAccessVer2
Private strSql As String
Public Function GetAllData()
strSql = "SELECT * FROM users"
Return GetDataTable(strSql)
End Function
Public Function SaveData(ByVal dt As DataTable)
SaveDataTable(dt)
End Function
End Class
</code>
aspx sida
<code>
Public Class ShowData
Inherits System.Web.UI.Page
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If IsPostBack = True Then
Dim objData As New Data()
Dim dt As DataTable = objData.GetAllData()
DataGrid1.DataSource = dt
DataGrid1.DataBind()
TextBox1.Text = dt.Rows(2)(2)
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Save the update
Dim objData As New Data()
Dim dt As DataTable = objData.GetAllData()
dt.Rows(2)(2) = TextBox1.Text
objData.SaveData(dt)
End Sub
End Class
</code>Sv: Hur beh&amp;amp;#229;ller man v&amp;amp;#228;rden fr&