Comment puis-je construire mon EditForm dans asp.net où deux listes déroulantes sont inter-dépendants?

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

  •  21-08-2019
  •  | 
  •  

Question

J'ai un petit problème, je crée une page d'édition dans mon application asp.net où l'utilisateur peut modifier les propriétés d'un objet. J'ai deux listes déroulantes (catégorie et de groupe) ou est dépendante de la catégorie choisie la quantité de groupes. Mon but est d'afficher la bonne catégorie og l'objet en cours d'édition, puis charger la liste des groupes et sélectionnez le bon groupe -. Problème est que mon événement SelectedIndexChanged est jamais tiré

Quand je charge mes catégories dans page_load et alimenter les catégories le code ressemble à ceci:

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 gestionnaire je voudrais exécuter devrait charger tous les groupes et remplir la liste déroulante et sélectionnez le correct:

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;
            }
        }
    }

Je ne sais pas ce qui va mal, cela semble être une chose simple à faire, ce que je fais mal?

Était-ce utile?

La solution

Pour cet événement au feu, la page doit Postback en cas de changement de sélection de l'utilisateur. Cela entraînera la page entière à rafraîchir (mais les contrôles devraient conserver leur état).

Cet événement SelectedIndexChanged fonctionne sur le serveur et je pense qu'il ya une propriété sur le premier menu déroulant sur la soumission / postback lorsque l'élément sélectionné change sur elle.

Pour obtenir un comportement côté client, vous pouvez faire deux choses:
1) Enveloppez cette section dans un UpdatePanel et ont la deuxième actualisation de la liste lorsque la première valeur de change de un
2) Charger les valeurs en utilisant le code JavaScript côté client qui se déclenche quand la valeur sélectionnée des changements sur le premier, extrait la liste et remplit le second
  2a) Vous pouvez écrire un service qui enveloppe l'appel à la source de données et renvoie les valeurs JSON, etc., ou   2b) Vous pouvez remplir toutes les valeurs pour tous les choix possibles dans les champs cachés qui sont en quelque sorte a identifié par les valeurs de la première boîte (ce n'est pas souhaitable, mais il est possible en fonction de la sécurité et la taille de vos ensembles de données) .

L'option 1 est probablement la façon la plus simple de conserver votre code existant et toujours obtenir un comportement côté client.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top