2009-01-27 4 views
2

Je ne parviens pas à déclencher le SelectedIndexChanged de ma liste déroulante. J'ai les suivantes:Pourquoi l'événement SelectedIndexChanged ne se déclenche-t-il pas à partir d'une liste déroulante dans un GridView?

<form id="form1" runat="server"> 
<div> 
<asp:GridView id="grdPoll" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:DropDownList ID="DropDownList1" runat="server" 
       AutoPostBack="true" 
       OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"> 
        <asp:ListItem Text="Review" Value="Review" Selected="True">Review</asp:ListItem> 
        <asp:ListItem Text="Level1" Value="lvl1">Send Back to Level1</asp:ListItem> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

<asp:Label ID="lblCity" runat="server" Text="Label"></asp:Label> 
</div> 
</form> 

Dans mon code derrière je ceci:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    this.lblCity.Text = ((DropDownList)sender).SelectedValue; 
} 

Si je mets ce même ddl en dehors de la gridview, il se déclenche.

La publication est en cours et l'autopostback est défini sur true. L'événement ne se déclenche jamais. Pourquoi ne puis-je pas déclencher mon événement à partir de la grille?

Merci.

Répondre

7

Eh bien, cette question a été posée il y a plus d'un mois et n'est peut-être plus pertinente, mais @LFSR a eu la gentillesse de l'éditer récemment, dans la liste des "Questions actives".

Étant donné qu'il reste sans réponse (! 224 vues), je pensais que je devrais donner un aller:


Le problème est que dans le contexte d'un GridView, DropDownList (appelé ci-après DDL) est un contrôle dynamique et par conséquent ses événements doivent être rattachés au Postback.

Lorsque ce concept est entendu, la solution devient relativement simple:

ASPX:

<asp:DropDownList ID="DDL1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DDL1_SelectedIndexChanged"> 
    <asp:ListItem Text="Review" Value="Review" Selected="True">Review</asp:ListItem> 
    <asp:ListItem Text="Level1" Value="lvl1">Send Back to Level1</asp:ListItem> 
</asp:DropDownList> 

code CS:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack) 
    { 
    // Bind the GridView to something. 
    DataBindGrid(); 
    } 
} 

protected void DDL1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    this.lblCity.Text = ((DropDownList)sender).SelectedValue; 
} 

protected void grdPoll_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(Page.IsPostBack) 
    { 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     DropDownList ddl = e.Row.FindControl("DDL1") as DropDownList; 
     if(ddl != null) 
     { 
     ddl.SelectedIndexChanged += new EventHandler(DDL1_SelectedIndexChanged); 
     } 
    } 
    } 
} 
+0

Merci. J'ai finalement dû changer pour une autre façon de faire les choses qui ne l'exigeait plus, mais je sais que j'en aurai besoin dans le futur. Merci encore. – johnny

+0

Bienvenue, Johnny! Heureux d'aider. :-) – Cerebrus

0

Eh bien, cela n'a pas résolu le problème pour moi. Je dois dire que cela fonctionnait correctement sur ma boîte même sans avoir à câbler l'événement dans RowDataBound. Ce n'est pas le seul problème que le gridview semble avoir en ce moment, même les collections de touches de données disparaissent, je pense que cette grille est seulement conçue pour fonctionner avec les sources de données asp.net pour agir correctement. Je vais réécrire mon code pour travailler avec une source de données d'objet pour valider mes soupçons.

+0

Vous n'êtes pas revenu avec plus de commentaires, mais je ne pense pas que votre soupçon que GridView fonctionne uniquement avec les contrôles DataSource est valide. Je l'ai utilisé avec de nombreux types de structures IEnumerable. – Cerebrus

0

Je ne peux pas expliquer pourquoi, mais je rencontre le même comportement lorsque je ajoute dynamiquement ListItem à la DropDown. Utile uniquement si vous n'avez pas besoin de la valeur ListItem.

Essayez d'ajouter la valeur de chaîne au lieu d'un ListItem:

Par exemple:

// change this 
DDL1.Items.Add(new ListItem("Review","Review")); 

// To this 
DDL1.Items.Add("Review"); 
+0

@Jeff: Je ne sais pas exactement ce que vous voulez dire et à quel point cela est pertinent pour la question posée, mais le code ci-dessus devrait théoriquement avoir le même effet. – Cerebrus

1

J'ai trouvé la fixation d'un gestionnaire d'événements à l'intérieur ItemDataBound ne fonctionne pas; aussi DropDownList n'a pas de propriétés CommandName ou CommandArgument, de sorte que l'événement ItemCommand de la grille ne se déclenchera pas en réponse à un changement d'index sélectionné dans une liste déroulante.

Cependant, vous pouvez le faire en Page_Load pour déterminer ce qui a causé le poste: -

 var target = Request.Form["__EVENTTARGET"]; 

     if (!string.IsNullOrEmpty(target) && target.Contains("cboAttribute")) 
     { 
      var cboAttribute = Page.FindControl(target) as DropDownList; 

      if (cboAttribute != null) 
      { 
       // this one fired the event 
      } 
     } 

Ma grille contient un tas de menus déroulants appelés cboAttribute, et cela me donne une référence à celui qui a causé le poste .

1

Faites attention lorsque vous effectuez la liaison de données. J'ai eu le même problème sur une page de test. L'événement DD selectedIndex ne se déclencherait pas. Il s'avère que je reconsolidais le gridview sur chaque page de service qui tue efficacement l'événement. Dès que j'ai seulement lié seulement sur page.ispostback=false les événements ont tiré comme prévu et a été pris par le DD générique. À partir de là, vous pouvez répéter les ID client gridview de vos DD pour trouver celui qui correspond à sender.clientID dans le gestionnaire générique.

0

J'ai rencontré un problème similaire avec une zone de liste déroulante dans une grille ne tirant pas. Dans mon cas, la raison pour laquelle la méthode ne tirait pas était parce qu'il y avait un élément qui devait être validé qui était caché. Assurez-vous donc de vérifier que vous n'avez aucun validateur caché qui pourrait déclencher et empêcher l'exécution de la liste déroulante.

Questions connexes