Come faccio a costruire il mio EditForm in asp.net dove due menù a discesa sono interdipendenti?
-
21-08-2019 - |
Domanda
ho un piccolo problema, sto creando una pagina di modifica nella mia applicazione asp.net cui l'utente può modificare le proprietà di un oggetto. Ho due menù a discesa (categoria e di gruppo) in cui la quantità di gruppi dipende da categoria prescelta. Il mio obiettivo è quello di visualizzare giusta categoria og l'oggetto in fase di modifica, quindi caricare la lista dei gruppi e selezionare il gruppo corretto -. Problema è che il mio evento SelectedIndexChanged è mai sparato
Quando carico le mie categorie in Page_Load e popolare la categorie il codice simile al seguente:
protected void Page_Load(object sender, EventArgs e)
{ string editid= Request["edit"] == null ? null : Request["edit"].ToString();
int id = Convert.ToInt32(editid);
if (link == null)
{
link = BLLink.Load(id, blm);
}
if (!IsPostBack)
{
group = BLGroup.Load(link.GroupId, blm);
category = BLCategory.Load(group.CategoryId, blm);
List<BLCategory> categories = BLCategory.LoadAll();
categoryDropDown.DataSource = categories;
categoryDropDown.DataTextField = "CategoryName";
categoryDropDown.DataValueField = "id";
categoryDropDown.SelectedValue = category.id.ToString(); //this one doesnt cause the event to fire??? Doesnt matter if it is called after the databind() method
categoryDropDown.DataBind();
}
}
theevent gestore vorrei eseguire dovrebbe caricare tutti i gruppi e popolare la discesa e selezionare quello corretto:
protected void categoryDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
category = BLCategory.Load(Convert.ToInt32(categoryDropDown.SelectedValue), new TestModelDataContext());
if (category != null)
{
List<BLGroup> groups = BLGroup.LoadAll(category.id);
groupDropDown.DataSource = groups;
groupDropDown.DataTextField = "GroupHeading";
groupDropDown.DataValueField = "GroupId";
groupDropDown.DataBind();
if (group != null)
{
groupDropDown.SelectedValue = group.GroupId.ToString();
}
else
{
groupDropDown.SelectedIndex = 0;
}
}
}
Non so cosa non va, questa sembra una cosa semplice da fare, che cosa sto facendo male?
Soluzione
Per ottenere questo evento al fuoco, la pagina ha bisogno di postback quando cambia la selezione dell'utente. Questo farà sì che l'intera pagina per aggiornare (ma i controlli dovrebbe mantenere il loro stato).
Questo evento SelectedIndexChanged è in esecuzione sul server e penso che ci sia una proprietà sulla prima discesa sull'invio / postback quando la voce selezionata su di esso.
Per ottenere un comportamento lato client, si possono fare due cose:
1) Avvolgere tale sezione in un UpdatePanel e avere il secondo elenco di aggiornamento quando il primo di una valore cambia
2) Caricare i valori usando codice JavaScript lato client che viene generato quando cambia valore selezionato sul primo, recupera la lista e riempie la seconda
2a) È possibile scrivere un servizio che avvolge la chiamata alla sorgente dati e restituisce i valori come JSON, ecc, o
2b) Potete riempire tutti i valori per ogni possibile scelta in campi nascosti che sono in qualche modo ha identificato dai valori nella prima casella (questo non è auspicabile, ma è possibile in funzione della sicurezza e la dimensione dei set di dati) .
L'opzione 1 è probabilmente il modo più semplice per mantenere la vostra base di codice esistente e ancora ottenere il comportamento lato client.