2009-08-17 8 views
1

Bon, j'ai des problèmes pour obtenir la valeur d'un DropDownList qui se trouve dans un TemplateField lors de la mise à jour de mon GridView. À l'origine, j'utilisais l'événement RowCommand pour vérifier le nom de la commande puis exécuter la tâche appropriée (mise à jour/suppression), mais l'incident se déclenchant deux fois, je l'ai remplacé par des événements distincts (RowUpdating, RowDeleting). Après cela, FindControl renvoie null à chaque fois. Juste pour info, le gridview est à l'intérieur d'un UpdatePanel qui a un AsyncPostBackTriggers pour les événements RowEditing, RowUpdating et RowDeleting.Problème lors de la recherche du contrôle Web dans Gridview TemplateField

Voici mon TemplateField intérieur du GridView:

<asp:TemplateField HeaderText="Type"> 
    <ItemTemplate> 
     <asp:Label 
      ID="lblMedTypeEdit" 
      Text='<%# Bind("medDesc") %>' 
      runat="server"> 
     </asp:Label> 
    </ItemTemplate> 
    <EditItemTemplate> 
     <asp:DropDownList 
      ID="ddlMedTypeEdit" 
      DataSourceID="srcMedTypes" 
      SelectedValue='<%# Bind("medtype") %>' 
      runat="server" 
      DataTextField="medDesc" 
      DataValueField="medCode"> 
     </asp:DropDownList>        
    </EditItemTemplate> 
</asp:TemplateField> 

Voici le code que je utilise l'intérieur de

Protected Sub gvCurrentMeds_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gvCurrentMeds.RowUpdating 
    Dim intRowIndex As Integer = e.RowIndex 
    Dim ddlMedType As DropDownList = CType(Me.gvCurrentMeds.Rows(intRowIndex).Cells(1).FindControl("ddlMedTypeEdit"),DropDownList) 
End Sub 

J'ai essayé également d'utiliser une fonction récursive pour trouver la commande (ci-dessous) , mais il revient toujours nul.

Public Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control 
    If root.ID = id Then 
     Return root 
    End If 

    For Each c As Control In root.Controls 
     Dim t As Control = FindControlRecursive(c, id) 
     If Not t Is Nothing Then 
      Return t 
     End If 
    Next 
    Return Nothing 
End Function 
+0

En fait, j'étais en mesure d'utiliser l'événement RowCommand à la place, mais il serait toujours agréable de savoir comment faire. :) – Brian

Répondre

1

Si vous voulez juste savoir ce que la nouvelle valeur de la liste déroulante est, cela est déjà prévu pour vous dans la propriété de l'objet NewValuesGridViewUpdateEventArgs transmis au gestionnaire d'événements.

Dans votre exemple, e.NewValues["medtype"] doit être la valeur mise à jour.

Vous avez déjà spécifié <%# Bind(...) %> dans la liste déroulante, ASP.NET va donc chercher les contrôles et obtenir les nouvelles valeurs - vous n'avez pas besoin de vérifier vous-même la hiérarchie de contrôle.