Spero di spiegarmi bene.
Creo da programma un TextBox e lo metto nel PlaceHolder. E questo nell'evento load della pagina.
Vorrei, durante la creazione del textbox, e prima di inserirlo nel PlaceHolder, recuperare l'attributo Text dal ViewState.
![]()
Spero di spiegarmi bene.
Creo da programma un TextBox e lo metto nel PlaceHolder. E questo nell'evento load della pagina.
Vorrei, durante la creazione del textbox, e prima di inserirlo nel PlaceHolder, recuperare l'attributo Text dal ViewState.
![]()
Pietro
Non vorrei dire un'idiozia e se è possibile con qualche tecnica particolare, ma per poterne ancora prendere il valore lo devi inserire nella pagina in modo che "esso" si riprenda il valore dal viewstate.
Un'altra strada, essendo eseguito il postback, e cercare di prenderne il valore come se fosse un input type text qualsiasi:
testo=Request("nome_campo_textbox")
E' una cosa curiosa comunque, se scopri qualcosa fai sapere!
Ciao
Non sono riuscito a risolvere come vorrei ma, visto che sei interessato, ti dico come ho cercato di risolvere.
Prima di tutto il problema.
Ho realizzato un UserControl, che serve come filtro per interrogare tabelle di database. Lo puoi immaginare come una tabella le cui righe contengono 4 colonne:
1) nome del campo
2) dropdown operatori (=, <>, >, <, tra, nullo, ....)
3) textbox1
4) textbox2
Adesso, il textbox2, è visibile solo se l'operatore è tra (beetween) e, textbox1 è visibile solo se l'operatore non è nullo o non nullo.
Io ho risolto modificando lo stile visibility nel client (e funziona).
Però, visto che i controlli sono generati nel server, mi chiedo se non sia possibile risolvere tutto nel server.
Allora, mi sono creato un semplice UserControl per prova. Questo UserControl crea da programma due textbox, e rende visibile o meno il secondo text box a seconda che l'utente scriva qualcosa o meno nel primo.
Il codice è moltro più chiaro delle mie parole.
Per funzionare, funziona. Ma secondo me esiste qualche metodo nativo per fare ciò senza interrogare la collezione Form.codice:Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Inserire qui il codice utente necessario per inizializzare la pagina crea() End Sub Private Sub crea() Dim tb As TextBox tb = New TextBox tb.ID = "tb1" 'recupero il nome del textbox Dim nc$ = Me.UniqueID & ":" & tb.UniqueID 'recupero il suo value dalla collezione Form Dim vnc$ = Trim(Me.Request.Form(nc)) PrintLn(vnc, nc) Me.PlaceHolder1.Controls.Add(tb) tb = New TextBox tb.ID = "tb2" 'qui modifico un attributo del secondo textbox 'in base al value del primo If vnc = "" Then tb.Attributes.Add("style", "visibility:hidden;") Else tb.Attributes.Add("style", "visibility:visible;") End If Me.PlaceHolder1.Controls.Add(tb) End Sub
![]()
Pietro
Invece degli attributi style, puoi utilizzare direttamente la property visible del textbutton:
If vnc = "" Then
tb.Visible=false
end if
E per sapere il nome client del textbox puoi usare:
Dim nc$ =tb.ClientId
Mi sa che altre soluzioni siano leggermente più complesse... Il gioco vale la candela?![]()
Scherzi a parte, se scopri qualcosa...
Ciao
Dunque, ho utilizzato un semplice esempio perchè non posso spedire centinaia di righe di codice e pretendere che qualcuno le leggaOriginariamente inviato da Alchimista
Invece degli attributi style, puoi utilizzare direttamente la property visible del textbutton:
If vnc = "" Then
tb.Visible=false
end if
E per sapere il nome client del textbox puoi usare:
Dim nc$ =tb.ClientId
Mi sa che altre soluzioni siano leggermente più complesse... Il gioco vale la candela?![]()
Scherzi a parte, se scopri qualcosa...
Ciao![]()
Il gioco ne vale sicuramente la candela. Un userControl ben fatto, infatti, è una scatola chiusa con tutto il codice dentro. Quando lo utilizzi in più pagine, ti risparmi molto codice. In altre parole, è un buon investimento.
SOLUZIONE
codice:Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Inserire qui il codice utente necessario per inizializzare la pagina crea() End Sub Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs) MyBase.OnPreRender(e) Dim tb1 As TextBox = DirectCast(Libreria.FindControlRecursive(Me.PlaceHolder1, "tb1"), TextBox) Dim tb2 As TextBox = DirectCast(Libreria.FindControlRecursive(Me.PlaceHolder1, "tb2"), TextBox) Dim vnc$ = tb1.Text If vnc = "" Then tb2.Attributes.Add("style", "visibility:hidden;") Else tb2.Attributes.Add("style", "visibility:visible;") End If End Sub Private Sub crea() Dim tb As TextBox tb = New TextBox tb.ID = "tb1" Me.PlaceHolder1.Controls.Add(tb) tb = New TextBox tb.ID = "tb2" Me.PlaceHolder1.Controls.Add(tb) End Sub![]()
Pietro
La scatola rimane chiusa anche se utilizzi il request.form con il control.ClientID....
Il FindControlRecursive cerca i control all'interno della pagina, e il tuo scopo è prenderne i valori...
Ciao