Hallå! Jag är på tok för lat för att läsa igenom allt du skrev men om jag inte har förstått dig helt fel så har jag haft samma problem tidigare. Tackar Kalle! Tips: Använd inte session. Tänk dig att användaren har två fönster öppna på samma sida. Då kommer de att krocka... Använd t.ex. viewstate eller liknande (inte helt snällt mot laddningstiderna; men, men) Vänta nu Onkelborg... Nope; sessions är saker som sparas på servern. För att identifiera dig så används cookies. Ta t.ex. pellesoft; använder sessions, du är inloggad i alla fönster... Sessioner är bundna till ett explorer fönster. Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/child)
Har ett delikat problem.
Jag har en menystruktur baserad på parent/child och skall rendera lite dropdownmenyer. Skall försöka förklara vad jag har och vad jag vill uppnå.
Jag har en tabell med kategorier:
ID|Namn|ParentID
0|Frukt|<null>
1|Grönsaker|<null>
2|Bananer|0
3|Ekologiska|2
4|Chiquita|3
5|Äpplen|0
6|Gröna|5
7|Spanien|6
8|Besprutade|7
9|Potatis|1
...osv....
Jag har nästan 1000 grupper i tabellen.
Ni som kan parent/child läser tabellen direkt, men bara för att förtydliga:
Just nu har vi alltså följande sökvägar
Frukt / Bananer / Ekologiska / Chiquita
Frukt / Äpplen / Gröna / Spanien / Besprutade
Grönsaker / Potatis
Jag vill nu ha lite dropdownmenyer där man kan välja kategori och följdaktligen visa underkategorin efter en PostBack.
Första droppisen skulle innehålla "Frukt" och "Grönsaker". Väljer jag "Grönsaker" ska jag rendera en till droppis som innehåller "Potatis" som val. Om jag väljer "Frukt" vill jag ha en som renderas med "Bananer" och "Äpplen". Väljer jag sedan "Äpplen" vill jag ha ytterligare en som innehåller "Gröna" osv. Ja, ni förstår principen.
Nu är det ju så att jag inte vet hur många nivåer ner menyn kommer gå och således kan jag inte bara lägga dit några droppisar i design-mode. Jag måste alltså lägga dit allt i run-time.
Jag har labbat en hel del nu med counters, viewstate, sessioner, addhandlers m.m. men inte riktigt fått det o lira. Jag kan lägga dit flera dynamiskt men jag kan inte fånga SelectedIndexChanged på respektive control.
Lite kod....
Public Class ViewStateDemo
Inherits Sys.Core.Page_Base
Protected WithEvents Panel1 As System.Web.UI.WebControls.Panel
'this member stores the number of TextBoxes that are already created by the sub AddDynamicControlsPanel1
Private _panel1CountAdded As Int32 = 0
Protected WithEvents btnAddDrop As System.Web.UI.WebControls.Button
'this properties stores the number of TextBoxes that were created on Panel1 after the last page cycly
Private Property Panel1Count() As Int32
Get
If Not IsNothing(ViewState("Panel1Count")) Then
Return CType(ViewState("Panel1Count"), Integer)
Else
Return 0
End If
End Get
Set(ByVal Value As Int32)
ViewState("Panel1Count") = Value
End Set
End Property
'this properties stores the number of TextBoxes that were created on Panel2 after the last page cycly
#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()
If Not IsPostBack Then
AddDynamicControlsPanel1()
End If
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'recreate the controls like they were at the end of the last page cycle
End Sub
Private Sub AddDynamicControlsPanel1()
'this sub creates the number of controls as given in Panel1Count but starts with the number of controls already created
'for example if in Page_Load 4 controls were created, then the Panel1Count is increased by the button handler
'and now tis sub is called, it creates 1 additional TextBox (5-4) and gives it the ID "Panel1TB5"
Dim counter As Int32
Dim dp() As DropDownList
For counter = _panel1CountAdded To Panel1Count - 1
ReDim Preserve dp(counter)
If dp(counter) Is Nothing Then dp(counter) = New DropDownList
AddHandler dp(counter).SelectedIndexChanged, AddressOf HandleChange
dp(counter).ID = "Panel1TB" + (counter + 1).ToString()
For a As Integer = 0 To Panel1Count - 1
dp(counter).Items.Add("Panel1TB_" + (counter + 1).ToString())
Next
dp(counter).AutoPostBack = True
Panel1.Controls.Add(dp(counter))
Panel1.Controls.Add(New LiteralControl("<br />"))
Next
_panel1CountAdded = Panel1Count
End Sub
Private Sub btnAddDrop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddDrop.Click
'increase the counter of TextBoxes TO BE DRAWN by 1
Panel1Count += 1
'draw the additional TextBox
AddDynamicControlsPanel1()
End Sub
Private Sub HandleChange(ByVal sender As Object, ByVal e As EventArgs)
Response.Write(CType(sender, DropDownList).SelectedValue)
'increase the counter of TextBoxes TO BE DRAWN by 1
Panel1Count += 1
'draw the additional TextBox
AddDynamicControlsPanel1()
End Sub
End Class
Denna kan som sagt generera droppisarna men jag kan inte få den att fånga eventet SelectedINdexChanged från någon av controllerna.
Detta är ett utdrag från "ViewSateDemo" som finns på http://www.denisbauer.com/ASPNETSamples.aspx.
Jag utvecklar allt i VB och använder 1.1.4322 av frameworken.
Är det någon som har någon idé?
Tacksam för alla svar.
/FredrikSv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/child)
Mitt problem var att dropdrownlisterna försvann när jag gjorde en postback. Detta löste jag genom att ha en ArrayList med namnen på alla DropDownLister jag hade instansierat. Denna ArrayList sparade jag i en Session mellan sidladdningarna.
Vid varje postback var jag tvungen att återskapa dropdownlisten i OnInit eventet.
Lite bökigt men höll man tungan rätt i munnen fungerade det fint. När jag väl återskapat dropdownen så sköte .net det fint med att hålla staten för listan.
Hoppas detta kan hjälpa dig på vägen annars får jag be om ursäkt för att jag är lite väl lat ibland ;)Sv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/child
Ja, det är lite åt det hållet. Jag har gjort en fuling (så som man inte ska göra;-)) för att få det att funka, men jag söker en riktig dynamisk lösning. Just nu har jag tagit höjd för 10 nivåer, alltså lagt dit 10 droppisar och sätter visible true/false vartefter man väljer en nivå. Jag får det resultat jag vill, men jag gillar INTE att göra denna kombination av statisk och dynamisk programering.
Jag förstår precis hur du menar men undrar om du kort kan beskriva hur du gjorde när du återskapade controllerna. Var det typ
dim x as integer = CType(Session("DropDownListsCount"),Integer)
for i as integer = 0 to x
dim s as string = "DropDown" & i
placeholder.controls.add(CType(Session(str),DropDownList)
Next
Om det var ungefär så, hur gjorde du då för att hålla state i varje control? Alltså gjorde du en ny och fyllde med ListItems eller konverterade du sessionen till en dropdown bara?
Tack så länge,
Fredrik
PS Inte en helt lätt nät o knäcka. Jag har gjort en javaträd som ritar upp det perfekt. Skrev en egen AddNode och CloseNode. VÄLDIGT lite programmering för att rita upp ett träd.Sv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/chil
Sv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/chi
Är inte två fönster att betrakta som två OLIKA sessioner??? Det är iaf vad jag har för mig/kommit fram till.
Eller?Sv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/ch
Enda möjligheten skulle väl vara om du körde cookieless; men det skulle fortfarande ställa till problem om man någon gång trycker ctrl+n och öppnar aktuellt fönster igen...Sv: Rendera drop-down dynamisk baserat på en SelectedIndexChanged (parent/c
Kakan lagras i din CookieContainer som är dit explorer fönster.