Il menu a discesa non viene visualizzato dopo il Databinding
-
05-07-2019 - |
Domanda
Sono vincolante per un menu a discesa. Funziona sul carico iniziale. Sui carichi successivi (postback) non aggiorna gli elementi nel menu a discesa.
using (DataView dv = dtProductGroup.DefaultView)
{
dv.ApplyDefaultSort = false;
dv.Sort = "KVIGroupName ASC";
ddlGroup.ClearSelection();
ddlGroup.Items.Clear();
string strAll = Localization.GetResourceValue("_strddlStatusLBAll");
ddlGroup.DataValueField = "KVIGroupId";
ddlGroup.DataTextField = "KVIGroupName";
ddlGroup.DataSource = dv;
ddlGroup.DataBind();
ListItem item = new ListItem(strAll, "0");
ddlGroup.Items.Insert(0, item);
}
Ho confermato che sui postback i dati vengono associati al menu a discesa e gli elementi vengono aggiunti correttamente. Ma quando la pagina viene visualizzata, il menu a discesa non ha nessuno dei nuovi valori.
Vedo due possibilità: il controllo non esegue il rendering dei nuovi valori o i valori vengono cancellati. Sono in perdita di dove cercare possibili problemi.
Modifica
Ho scoperto il problema. L'elenco a discesa è stato incorporato in un UpdatePanel condizionale. Basta chiamare " UpdatePanel.Update (); " risolto il problema.
Soluzione
Su Postback viene riapplicato il viewstate + hai detto che stai cercando di caricare nuovamente i valori. Suggerirei a Viewstate di portare tutto il peso sul postback. Carica i valori solo quando la pagina viene visualizzata per la prima volta aggiungendo se (! IsPostBack) in questo modo
using (DataView dv = dtProductGroup.DefaultView)
{
if (! IsPostBack) {
dv.ApplyDefaultSort = false;
dv.Sort = "KVIGroupName ASC";
ddlGroup.ClearSelection();
ddlGroup.Items.Clear();
string strAll = Localization.GetResourceValue("_strddlStatusLBAll");
ddlGroup.DataValueField = "KVIGroupId";
ddlGroup.DataTextField = "KVIGroupName";
ddlGroup.DataSource = dv;
ddlGroup.DataBind();
ListItem item = new ListItem(strAll, "0");
ddlGroup.Items.Insert(0, item);
}
}
Modifica Inoltre, la sintassi garantisce che l'oggetto DataView a cui fa riferimento dv viene eliminato all'uscita dal blocco di codice. La mia seconda ipotesi è che questo provoca un effetto collaterale che causa il problema.
using (DataView dv = dtProductGroup.DefaultView)
{
Invece lascia fuori l'uso e scrivi una dichiarazione normale come la seguente (DataView verrà smaltito insieme a tutto il resto quando la pagina sarà terminata, quindi non c'è davvero bisogno di farlo da soli).
DataView dv = dtProductGroup.DefaultView;
Consulta la la documentazione MSDN su "utilizzo" e IDisposable per informazioni dettagliate.