Come faccio a costruire il mio EditForm in asp.net dove due menù a discesa sono interdipendenti?

StackOverflow https://stackoverflow.com/questions/1066238

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top