2011-10-05 16 views
8

Ho un GridView con un numero di BoundFields e due TemplateFields. In questi due TemplateFields, creo dinamicamente UserControls contenente un DropDownList e un TextBox, che gli utenti possono modificare.colonne dinamiche scompaiono dopo il postback

Quando si tenta di ottenere i valori dei controlli dopo un PostBack, i valori in BoundFields sono ancora lì ma i miei controlli dinamici scompaiono. Posso creare di nuovo ma non otterrà i valori dell'utente ... Come posso ottenere questi valori prima che siano persi?

Ecco alcuni del mio codice:

In caso RowDataBound:

Select Case type 
    Case "BooleanBis" 
     e.Row.Cells(2).Controls.Clear() 
     Dim list1 As BooleanBisList = New BooleanBisList(avant, False) 
     e.Row.Cells(2).Controls.Add(list1) 

     e.Row.Cells(4).Controls.Clear() 
     Dim list2 As BooleanBisList = New BooleanBisList(apres, True) 
     e.Row.Cells(4).Controls.Add(list2) 
    Case "Boolean" 
     e.Row.Cells(2).Controls.Clear() 
     Dim list3 As BooleanList = New BooleanList(avant, False) 
     e.Row.Cells(2).Controls.Add(list3) 

     e.Row.Cells(4).Controls.Clear() 
     Dim list4 As BooleanList = New BooleanList(apres, True) 
     e.Row.Cells(4).Controls.Add(list4) 
End Select 

Nel mio pulsante evento click, cerco di ottenere il controllo utente:

Case "String" 
    temp.ChampValeurApres = DirectCast(Tableau1.Rows(i).Cells(selectedColumn).Controls(1), TextBox).Text 

ma ottengo l'errore che non esiste

risposta

8

È necessario creare controlli dinamici in RowCreated invece di RowDataBound perché questo evento viene attivato su ogni postback, mentre RowDataBound solo scatterà quando la GridView ottiene Databound alla sua DataSource.

I controlli creati dinamicamente devono essere ricreati su ogni postback con lo stesso ID di prima, quindi mantengono i loro valori nel ViewState e gli eventi vengono attivati ​​correttamente (ad esempio l'evento SelectedIndexChanged di DropDownList).

Così si dovrebbe crearle in RowCreated e "riempire" loro in RowDataBound (f.e. le DropDownList origine dati/Articoli o un TextBox -Testo).

+0

Grazie mille! Ho ancora un problema, ho una colonna con controlli di sola lettura. e il valore di questi controlli non viene recuperato dopo il postback. qualche idea ? – user874854

+0

@ user874854: i controlli 'readonly' non mantengono le modifiche sul client in ViewState (solo le modifiche su serveride). Renderli 'readonly' tramite [Attributes] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.attributes.aspx) -collection, ad esempio:' TextBox1.Attributes .Add ("sola lettura", "sola lettura"); '. In questo modo prendi in giro ASP.NET. Guarda [qui] (http://www.codeproject.com/KB/aspnet/Readonly.aspx) per ulteriori informazioni. –

0

avevo usato:

EnableViewState="false" 

nelle GridView attributi. Rimuovendolo risolto il mio problema!