35 messaggi dal 04 luglio 2003
Ho un ListView con all'interno dei controlli con valori in binding, ad esempio:
<asp:ListView ID="MiaListView" runat="server" ItemType="MioTipo">
    <ItemTemplate>
        <table>
            <tr>
                <td>
                    <asp:TextBox ID="MioTextBox" runat="server" Text=<%# BindItem.MioTesto %> />
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:ListView>

Nel code-behind del PreRender, in certi casi vorrei rifare il DataBind del TextBox.
Se recupero il TextBox nel codice e tento di farne il DataBind, mi da' questo errore:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

Se invece rifaccio il DataBind dell'intera ListView, funziona.
All'interno delle righe della ListView pero', in realta' ci sono anche altri controlli, di cui non voglio fare il DataBind.
Come posso forzare il DataBind di singoli controlli all'interno di una riga di ListView?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Fabiana,
per capire meglio l'errore, posta il codice che hai nel PreRender.

Nel frattempo, potresti provare delle alternative tipo gestire l'evento OnItemDataBound della ListView, che verrà sollevato per ogni riga presente nella ListView stessa. Questo ti permetterebbe di esaminare sia i dati della riga che accedere ai controlli del suo ItemTemplate.

In alternativa, puoi gestire gli eventi OnLoad o OnDataBinding del singolo controllo, come la tua TextBox.

Non so precisamente cosa consigliarti perché non conosco lo scenario specifico. Comunque, in linea generale, quel che dovresti fare è gestire gli eventi della ListView o dei singoli controlli perché così è più facile ottenere i loro riferimenti rispetto all'arrivarci dal PreRender della pagina.

ciao,
Moreno.

Enjoy learning and just keep making
35 messaggi dal 04 luglio 2003
Nel PreRender ho:
        For Each LDI As ListViewDataItem In MiaListView.Items
            LDI.FindControl("MioTextBox").DataBind()
        Next

Ma non ho problemi ad arrivare al controllo TextBox, il problema e' farne il DataBind.
Ho anche provato ad agganciare il PreRender del TextBox e fare il DataBind del sender (dove ho verificato che il sender fosse effettivamente MioTextBox), ma da' lo stesso identico errore.
Il problema e' come forzare il DataBind di singoli controlli all'interno di una riga di ListView, senza rifare il DataBind di tutta la ListView, perche' quando ci provo mi da' l'errore
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
perché hai la necessità di invocare il metodo DataBind sulla TextBox? Non è necessario: la casella si riempirà con il testo trovato in BindItem.MioTesto senza dover invocare il metodo DataBind esplicitamente. Se hai bisogno di cambiare il valore della proprietà Text, semplicemente reimposta la proprietà Text.

Metti le virgolette o gli apici singoli nell'attributo Text:
<asp:TextBox ID="MioTextBox" runat="server" Text='<%# BindItem.MioTesto %>' />


ciao,
Moreno

Enjoy learning and just keep making
35 messaggi dal 04 luglio 2003
In ogni riga della ListView in realta' ho diverse TextBox, non una sola.
L'utente inserisce dei valori in alcune TextBox e conferma con un Button avviando un postback.
Nel code-behind le TextBox variate dall'utente si riempiono correttamente con il testo inserito dall'utente.
Altre TextBox non variate dall'utente si riempiono correttamente con i valori che avevano anche prima del postback.
Pero' poi in fase di Load faccio partire un'elaborazione nel code-behind, che puo' cambiare alcuni dei valori della sorgente dati, e questi altri valori sono anche loro in Binding in altre TextBox della stessa riga della ListView.
Di conseguenza ho bisogno di rifare il binding di queste altre TextBox "a mano", altrimenti non vedrei i valori variati da codice.
Se rifaccio il DataBind di tutta la ListView, la cosa funziona e vedo anche i valori aggiornati da codice, pero' la cosa e' troppo pesante, sia perche' so di aver variato solo i valori di una riga del ListView e non mi serve rifare il binding di tutte le righe, sia perche' ci sono anche altri controlli di tipo lista oltre ai TextBox, che sono pesanti da ricaricare.
Ho provato a fare il (re-)DataBind delle TextBox nella fase di Load invece che nella fase di PreRender ma da' lo stesso errore.
Ho provato a fare il (re-)DataBind della singola riga della ListView ma da' lo stesso errore.

E' normale che non sia possibile eseguire l'istruzione DataBind di un TextBox se e' in binding all'interno di una ListView?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


E' normale che non sia possibile eseguire l'istruzione DataBind di un TextBox se e' in binding all'interno di una ListView?

La TextBox non ha un proprio DataSource, quindi non è autonoma. Ha bisogno che il controllo contenitore (un databound control come la ListView) gli fornisca i dati a cui legarsi.

Penso che tu stia invocando il DataBind() della TextBox in un momento in cui la ListView non ha ancora attraversato la sua fase di binding e quindi non c'è alcun contesto di binding da cui la textbox possa prelevare il valore.

Provo a supportare questa tesi.

Ho provato a fare il (re-)DataBind delle TextBox nella fase di Load invece che nella fase di PreRender ma da' lo stesso errore.

Guarda gli eventi del ciclo di vita di una pagina ASP.NET:
https://i-msdn.sec.s-msft.com/dynimg/IC386473.png
Gli eventi di binding si scatenano dopo il PreRender e quindi anche dopo il Load. Se vuoi aggiornare il contenuto della Textbox, devi farlo DOPO che il databinding è avvenuto e questo lo puoi fare gestendo gli eventi di cui ti parlavo prima, per esempio gestendo l'evento OnItemDataBound della ListView.

Puoi anche provare dall'evento PreRenderComplete della pagina ma io continuo a sostenere la soluzione di OnItemDataBound.

Nel gestore di quell'evento vai a controllare se il valore della TextBox è cambiato. Se lo è, imposti la sua proprietà Text anziché invocare il suo metodo DataBind().

ciao,
Moreno
Modificato da BrightSoul il 17 agosto 2017 18.24 -

Enjoy learning and just keep making
35 messaggi dal 04 luglio 2003
Dimenticavo di dire che invoco il DataBind del controllo che contiene la ListView nella fase di Init.

Ho messo dei punti di interruzione negli eventi Init, DataBound, Load e PreRender e la sequenza e' proprio questa:

-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 delle TextBox modificate 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 nelle altre TextBox, anch'esse 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 delle TextBox, ma se lo faccio da' errore)

Se la ListView e' gia' stata in binding tra l'init e il load, e' possibile che nel PreRender non sia piu' in binding?
Sta forse facendo un secondo binding automatico tra il PreRender e il PreRenderComplete come nello schema del ciclo di vita che mi hai postato? Anche se glie l'ho gia' fatto fare prima?

Ora provo ad agganciare l'OnItemDataBound come mi hai suggerito.

L'idea di impostare il Text anziche' invocare il DataBind non mi piace molto, perche' dovrei ripetere nel codice la sorgente dati di ogni TextBox, cosi' come e' scritta nel markup. A meno che non ci sia il modo di ottenere nel codice quello che e' scritto nel markup e poterlo usare per impostare il Text.
35 messaggi dal 04 luglio 2003
Ho agganciato l'OnItemDataBound, e al suo interno ho provato ad eseguire
e.Item.FindControl("MioTextBox").DataBind()

Il risultato e' sempre l'errore
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

Dato che il binding della ListView e' appena stato completato, mi viene da pensare che questa affermazione sia vera:

Non e' mai possibile eseguire il DataBind di un TextBox se e' in binding all'interno di una ListView.

e per estensione,

Non e' mai possibile eseguire il DataBind di un controllo privo di proprieta' DataSource, se e' in binding all'interno di un controllo di tipo lista o repeater.

Ho cercato in internet informazioni per confermare o smentire questa affermazione ma non ho ancora trovato nulla.
Ti e' mai capitato di vedere qualcuno che e' riuscito a farlo?

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

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.