soluzioni tipiche a questo problema consiste nel creare nuovi controlli che non sono abbastanza fattibile in circostanze normali.C'è una soluzione semplice ma banale a questo problema.
Il problema è che il ListItem
perde i suoi attributi sul postback. Tuttavia, l'Elenco stesso non perde mai attributi personalizzati. Uno può approfittare di questo in un modo semplice ma efficace così.
Passi:
serializzare i tuoi attributi utilizzando il codice nella risposta precedente (https://stackoverflow.com/a/3099755/3624833)
Conservarlo per un attributo personalizzato della ListControl (DropDownList, CheckListBox, a prescindere).
Sul retro del post, leggere l'attributo personalizzato da ListControl e quindi deserializzare come attributi.
Ecco il codice che ho usato per (de) serializzare attributi (cosa che dovevo fare era quello di tenere traccia di quali elementi della lista sono stati originariamente reso come selezionati quando viene recuperato dal backend e poi salvare o cancellare righe come per le modifiche apportate dall'utente sull'interfaccia utente):
string[] selections = new string[Users.Items.Count];
for(int i = 0; i < Users.Items.Count; i++)
{
selections[i] = string.Format("{0};{1}", Users.Items[i].Value, Users.Items[i].Selected);
}
Users.Attributes["data-item-previous-states"] = string.Join("|", selections);
(sopra, "utenti" è un controllo CheckboxList
).
Su palo (nel mio caso un pulsante Invia evento Click), utilizzare il codice sottostante per recuperare lo stesso e memorizzarli in un dizionario per la post-elaborazione:
Dictionary<Guid, bool> previousStates = new Dictionary<Guid, bool>();
string[] state = Users.Attributes["data-item-previous-states"].Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);
foreach(string obj in state)
{
string[] kv = obj.Split(new char[] { ';' }, StringSplitOptions.None);
previousStates.Add(kv[0], kv[1]);
}
(PS: ho un funzioni di libreria che eseguono la gestione degli errori e le conversioni dei dati, omettendo lo stesso qui per brevità).
fonte
2015-01-06 03:53:22
Dovresti mostrare anche il tuo codice .aspx. – madcolor