11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Fabiana,
personalmente non mi è mai capitato di invocare il DataBind() su una TextBox, né di dover recuperare l'espressione di binding che è stata definita nella sua proprietà Text.

Nella documentazione è scritto:

Most controls perform data binding automatically, which means that you typically do not need to call this method explicitly.


Quindi, chiamarlo esplicitamente potrebbe anche produrre effetti collaterali tipo l'errore che stai avendo. Non so darti un'opinione perché non ho mai usato così la TextBox e perché la documentazione non chiarisce come mai esista il metodo pubblico DataBind nella classe Control se poi, di fatto, non va invocato per la maggior parte dei controlli.


Proseguo tentando di ricavare l'istruzione di binding del markup nel code-behind per usarla impostando Text.

Non lo puoi fare perché la tua espressione di binding viene trasformata durante la compilazione della pagina aspx. Se provi a decompilare l'assembly, non ne trovi più traccia.
La binding expression è un costrutto che semplifica la vita allo sviluppatore ma che poi viene "tradotto" nelle istruzioni che servono ad ottenere un riferimento al binding container della Textbox e a recupare da lì il valore che viene assegnato alla proprietà Text della textbox.
Leggi il paragrafo "Under the covers of the data binding expression" di questo articolo:
http://odetocode.com/Articles/278.aspx

Quindi, non cercare di reimpostare l'espressione di binding perché non sarà possibile. Non ho capito perché volevi farlo. Vuoi cambiare il nome del campo da cui ottenere il valore?

Invece, quello che puoi fare è scrivere un'espressione di binding che comprenda una tua funzione, in modo da avere il controllo sull'effettivo valore che verrà presentato nella TextBox. Vedi questo esempio:
https://stackoverflow.com/questions/22941426/webforms-eval-with-function-and-others-variables#answers-header


Ho agganciato l'OnItemDataBound, e al suo interno ho provato ad eseguire
e.Item.FindControl("MioTextBox").DataBind()

Anche questo va bene ma, anziché invocare il DataBind(), prova a reimpostare la proprietà Text. Se questo ti produce duplicazione di codice, estrai le parti duplicate in un nuovo metodo.

ciao,
Moreno
Modificato da BrightSoul il 18 agosto 2017 13.46 -

Enjoy learning and just keep making
35 messaggi dal 04 luglio 2003
Volevo ricavare l'espressione di binding non per cambiarla, ma per usarla da codice, in modo da assegnare ad ogni TextBox il valore della sorgente dati senza dover scrivere due volte le proprieta' di ciascuna TextBox.
Scrivendo
<asp:TextBox ID="MioTextBox1" runat="server" Text=<%# BindItem.MioTesto1 %> />
<asp:TextBox ID="MioTextBox2" runat="server" Text=<%# BindItem.MioTesto1 %> />
<asp:TextBox ID="MioTextBox3" runat="server" Text=<%# BindItem.MioTesto3 %> />

ecc... ecc...

e poi nel codice
.FindControl("MioTextBox1") = MiaSorgenteDati.MioTesto1
.FindControl("MioTextBox2") = MiaSorgenteDati.MioTesto2
.FindControl("MioTextBox3") = MiaSorgenteDati.MioTesto3

ecc... ecc...

scriverei codice doppio, quindi se aggiungo una TextBox nel markup devo ricordarmi di aggiungerla nel codice, doppia possibilita' di sbagliare il nome della proprieta', ricordarsi di togliere entrambe le righe se tolgo una TextBox, ecc.
Invece se potessi recuperare nel codice almeno "MioTesto1" dal MioTextBox1, potrei fare un ciclo su tutti i controlli di tipo TextBox e riassegnare in Text il valore della proprieta' della sorgente dati di ciascuno.

Se non si puo' recuperare il nome della proprieta' di binding da ciascuno, allora potrei usare come mi suggerisci delle espressioni di binding che comprendano delle mie funzioni per ciascuna proprieta'.
Gli svantaggi sono:
-perdo il binding two-way, che comunque ora sfrutto durante il primo giro di binding
-devo prevedere una funzione per ciascuna proprieta', e quindi di nuovo duplico del codice (una proprieta' e una funzione per ogni TextBox invece che solo una proprieta'), oppure devo studiare una funzione che vada bene per tutte le proprieta' (magari passando il nome della proprieta' come parametro della funzione)
-perdo il vantaggio dell'uso dell'ItemType e dell'intellisense per i nomi delle proprieta' in binding.

P.S.: In precedenza mi hai suggerito di mettere le virgolette o gli apici singoli nell'attributo Text, ma non capisco perche' dovrei farlo, dato che funziona anche senza. Anche qui non sono riuscita a trovare altre informazioni sulle differenze tra l'uso e il non-uso di virgolette o apici nelle espressioni di binding.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Fabiana,
sto facendo un po' di prove anch'io per capire se si riesce a trovare una soluzione che ti permetta di non duplicare il codice ed evitare di ripetere il binding della ListView.

Preparando un esempio mi è venuto questo dubbio: quando scateni il postback, nell'Init, rifai il binding della ListView oppure lasci che ricostruisca il suo stato dal ViewState?
  • Se al postback rifai il binding della ListView sempre e comunque, forse potresti spostarlo dall'Init al PreRender o comunque dopo aver modificato il data source della ListView. Tanto il costo del binding lo stai già pagando una volta per ogni richiesta, quindi tanto vale spostarlo verso la fine del ciclo di vita della pagina;
  • Se invece NON rifai il binding ma lasci che lo stato della ListView venga ricostruito dal ViewState, allora modificare il datasource non avrà effetto perché la ListView non sta leggendo i dati da lì. L'unica opzione è reimpostare a mano la proprietà Text, non mi vengono in mente altre soluzioni se non scriverti dei tuoi web control (che derivano da TextBox? Va ragionata...).



In precedenza mi hai suggerito di mettere le virgolette o gli apici singoli nell'attributo Text, ma non capisco perche' dovrei farlo, dato che funziona anche senza

Non ti preoccupare, ignora quanto ho detto, era solo per una questione di coerenza nella scrittura degli attributi.

ciao,
Moreno

Enjoy learning and just keep making
35 messaggi dal 04 luglio 2003
Ciao Moreno,

Nell'Init rifaccio il binding della ListView.

Potrei anche spostare il momento del primo databind, ma non posso metterlo dopo aver modificato il data source della ListView, perche' per l'elaborazione mi serve avere i dati modificati dall'utente in alcuni dei TextBox.

Vedi cosa scrivo nel Load?


-Init
(Invoco il DataBind del controllo che contiene la ListView)

-DataBound
(Qui i TextBox hanno ancora i valori precedenti alle modifiche dell'utente, ma stanno per fare anche loro il databound in cascata dal controllo padre)

-Load
(Qui vedo i valori dei TextBox modificati dall'utente e li passo all'elaborazione che modifica altri valori della sorgente dati)

Da questo momento ho bisogno che i valori della sorgente dati modificati dall'elaborazione siano visualizzati negli altri TextBox, anch'essi in binding.

-PreRender
(Ri-eseguo il DataBind della ListView cosi' vedo i dati modificati dall'elaborazione, perche' se non faccio nulla non li vedo, pero' vorrei ri-eseguire il DataBind solo dei TextBox, ma se lo faccio da' errore)
11.886 messaggi dal 09 febbraio 2002
Contributi
Heilà, stavolta sono arrivato preparato. Scarica questo progetto demo.
https://1drv.ms/u/s!Ao4rhSdtDw8rgekCXZ1fdG1zF-cSwA


Potrei anche spostare il momento del primo databind, ma non posso metterlo dopo aver modificato il data source della ListView, perche' per l'elaborazione mi serve avere i dati modificati dall'utente in alcuni dei TextBox.

Per avere i dati modificati dall'utente NON è necessario aver fatto il databind.
La ListView persiste il suo stato nel viewstate e, al postback, è in grado di rigenerarsi senza che tu debba rifare il databind. Poi, le TextBox si riempiranno dei valori digitati dall'utente, proprio come ti aspetti.

Prendi il progetto che ti ho linkato e guarda il codefile della pagina Default:
  • Il binding nel Page_Init avviene solo alla prima apertura di pagina;
  • Quando l'utente modifica le caselle di testo e clicca Invia, nel Page_Load puoi leggere i valori che ha digitato, in modo da poter aggiornare il data source;
  • Fai il binding nel PreRender per fare in modo che anche le altre textbox si aggiornino con i dati del datasource. Questo è l'unico databind della richiesta corrente;
  • La TextBox del totale risulta correttamente aggiornata, anche se l'utente ha modificato solo la quantità.


E' una soluzione che puoi applicare nel tuo caso?

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.