Jag sitter och försöker anlysera lite kodexempel från dotnetjunkies för att ev göra en egen version av koden så småningom. Jag känner mig däremot totalt fast i traditionell ASP och behöver få några delar förklarade om det är möjligt. Det som händer om det inte är postback vet du ju redan, den hämtar ut alla titlar från databasen med typen "business". OK, tackar för ett snabbt svar, det klarnade något. Det jag är ute efter (tror jag) är att har två DataList på samma sida, en som visar rubriker och en som visar alla detaljer. Alla data finns dock i samma tabell i en databas. Min fundering är då, varför inte hämta alla kolumner till ett dataset (SELECT * FROM ...) och sedan använda det till båda datalisterna utan att ställa en ny fråga till databasen? Tänker jag fel, eller? Hur ska man lägga upp det i så fall? Det du vill göra kan man göra på många sätt men vilket man väljer är ju beroende på hur duktig man är och vad man vill uppnå... Jag tackar för det så länge. Tror jag ska titta lite mer på hur DataSet fungerar och hur man filtrerar ut data därifrån.Master detail sida
I koden nedan så kontrolleras om det är första gången sidan laddas (not page.IsPostBack) och i så fall fyller man ett DataSet med data och binder det till en datalist. Så långt är jag med. Man har där deklarerat ett DataSet som nytt dataset (Dim DS As New DataSet).
I nästa sub (MyDataList_Select) deklareras ett nytt DataSet igen, med samma namn. För mig känns det som att deklarera en variabel som redan finns. Varför? Dessutom ställer man en ny SQL-fråga för att fylla ett DataSet som redan finns. Om man redan har dom data i ett dataset men kanske inte visat allt, kan man då inte utnyttja det utan att ställa en ny SQL-fråga? Säkert dumma frågor men hoppas att det klarnar lite. Jag hatar att "copy and paste" utan att fatta vad allt betyder och gör. Länkar till fler exempel på "master detail" tas också emot tacksamt.
<code>
<script language="VB" runat="server">
Dim MyConnection As SqlConnection
Sub Page_Load(Sender As Object, E As EventArgs)
MyConnection = New SqlConnection(System.Configuration.ConfigurationSettings.AppSettings("PubsString"))
If Not (Page.IsPostBack)
Dim DS As New DataSet
Dim MyCommand As New SqlDataAdapter("select * from Titles where type = 'business'", MyConnection)
MyCommand.Fill(DS, "Titles")
MyDataList.DataSource = DS.Tables("Titles").DefaultView
MyDataList.DataBind()
End If
End Sub
Sub MyDataList_Select(Sender As Object, E As EventArgs)
Dim Title As String = MyDataList.DataKeys(MyDataList.SelectedItem.ItemIndex)
Dim MyCommand As New SqlDataAdapter("select * from Titles where title_id = '" & Title & "'" , MyConnection)
Dim DS As New DataSet
MyCommand.Fill(DS, "TitleDetails")
Dim RowView As DataRowView = DS.Tables("TitleDetails").DefaultView(0)
DetailsImage.Src = "/quickstart/aspplus/images/title-" & RowView("title_id") & ".gif"
DetailsPubId.InnerHtml = "<b>Publisher ID: </b>" & RowView("pub_id").ToString() & "<br>"
DetailsTitleId.InnerHtml = "<b>Title ID: </b>" & RowView("title_id").ToString() & "<br>"
DetailsType.InnerHtml = "<b>Category: </b>" & RowView("type").ToString() + "<br>"
DetailsPrice.InnerHtml = "<b>Price: </b> $ " & RowView("price").ToString() + "<p>"
PurchaseLink.InnerHtml = "<img border='0' src='/quickstart/aspplus/images/purchase_book.gif' >"
PurchaseLink.HRef="purchase.aspx?titleid=" & RowView("title_id").ToString()
DetailsTitle.InnerHtml = RowView("title").ToString()
DetailsImage.Visible = true
End Sub
</script>
</code>Sv: Master detail sida
Om sidan däremot postas tillbaka kör den inte koden under Page_Load som är mellan If och End If.
Däremot har serverkontrollen gjort en postback och fyller istället sidan med information om den valda titeln.
Det spelar ingen roll att deklarationerna är lika i båda subbarna för de är bara lokalt deklarerade och kommer att dö ut sen när subben har kört klart.
Mvh,
ThomasSv: Master detail sida
Sv: Master detail sida
Men du tänker i rätt banor, ett anrop mindre till databasen när du ändå har all data du vill ha efter att ha fyllt i första listan.
Men man behöver inte fylla i listan mellan olika post för det ska postback ta hand om.
Det finns ett annat bra alternativ man kan ta hänsyn till också när man har data som ska hämtas flera gånger men som inte ändras speciellt ofta och det är Cachning.
Du kan cacha innehållet och hämta därifrån, men tänk dock på att ju mer data dessto mer minne upptar det.
Men cache är något för sig...
För att göra det du vill göra läggar du helt enkelt till två DataList på din sida och sen i Page_Load hämtar du först data till din DataSet och där kan du med hjälp av DefaultView lägga in liknande parametrar som i en SQL sats för att filtrera och sortera en fråga, precis som du skulle göra mot en databas.
Vet att det här kanske inte var så givande för dig, men om du undrar något så fråga så kan jag eller någon annan kanske svara på dina frågor.
Mvh,
ThomasSv: Master detail sida