2009-06-30 8 views
0

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 groupe) où le nombre de groupes dépend de la catégorie choisie. Mon but est d'afficher la bonne catégorie de l'objet en cours de modification, puis de charger la liste des groupes et de sélectionner le bon groupe. Le problème est que mon événement selectedindexchanged n'est jamais déclenché.Comment puis-je construire mon editform dans asp.net où deux listes déroulantes sont interdépendantes?

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 bon:

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?

Répondre

0

Pour que cet événement se déclenche, la page doit être PostBack lorsque la sélection de l'utilisateur change. Cela provoquera l'actualisation de la page entière (mais les contrôles doivent conserver leur état).

Cet événement SelectedIndexChanged est en cours d'exécution sur le serveur et je pense qu'il existe une propriété dans la première liste déroulante concernant l'envoi/la publication lorsque l'élément sélectionné est modifié.

Pour obtenir un comportement côté client, vous pouvez faire deux choses:
1) WRAP section dans un UpdatePanel et ont la deuxième actualisation de la liste lorsque la valeur de la première change
2) Charger les valeurs à l'aide client- JavaScript code secondaire qui se déclenche lorsque la valeur sélectionnée change sur le premier, récupère la liste et remplit la seconde
2a) Vous pouvez soit écrire un service qui enveloppe l'appel à la source de données et retourne les valeurs au format JSON, etc., ou 2b) Vous pouvez remplir toutes les valeurs pour chaque choix possible dans des champs cachés qui sont identifiés d'une manière ou d'une autre par les valeurs de la première case (ce n'est pas souhaitable, mais cela dépend de la sécurité et de la taille de vos données ensembles).

L'option 1 est probablement le moyen le plus simple de conserver votre base de code existante tout en conservant le comportement côté client.

+0

Pour les petits ensembles de données, je recommanderais l'option 2b. Pour les grands ensembles de données 2a. Je voudrais seulement recourir à l'option 1 rapide et sale si le temps de livrer est plus important que l'expérience de l'utilisateur. Les publications avec ou sans panneaux de mise à jour entraînent souvent une expérience utilisateur léthargique. –