2010-05-26 10 views
0

J'aime savoir comment obtenir le ClientID/UniqueID d'un contrôle à l'intérieur d'un élément DetailsView EditItemTemplate et lorsque DetailsViews passe en mode Edit et DetailsView est dans un AJAX UpdatePanel. Sans UpdatePanel, pendant PostBack je peux obtenir le contrôle du ClientID, mais maintenant avec un UpdatePanel.Obtenir des contrôles ClientID/UniqueID entre DetailsView et UpdatePanel

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="SqlDataSource1" AllowPaging="true" AutoGenerateEditButton="true"> 
       <Fields> 
        <asp:TemplateField> 
         <EditItemTemplate> 
          <asp:CheckBox runat="server" ID="chkboxTest" Text="CHECKBOX" /> 
         </EditItemTemplate> 
        </asp:TemplateField> 
       </Fields> 
      </asp:DetailsView> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

Comme vous le voyez, le EditItemTemplate contient un contrôle Checkbox. J'essaie donc d'obtenir le ClientID de cette case à cocher lorsque Detailsview passe en mode Edit. J'ai besoin de cette valeur pour gérer Javascript. Attraper les événements ChangingMode/ChangedMode ne fonctionne pas; chkbox is null:

void DetailsView1_ModeChanged(object sender, EventArgs e) 
    { 
     if (DetailsView1.CurrentMode == DetailsViewMode.Edit) 
     { 
      var chkbox = DetailsView1.FindControl("chkboxTest"); // <== is null 
     } 
    } 

Peut-être que j'utilise le mauvais événement? Quelqu'un peut me donner un conseil à ce sujet? Merci.

+0

Est-ce une faute de frappe dans votre événement ModeChanged dans FindControl, il cherche chkxboxTest ...? Si c'est votre code, cela pourrait être le problème. – Mantorok

+0

@Mantorok. désolé typo. Mais toujours nul. – robertpnl

+0

Ok, puis essayez Lignes [0] .Cellules [0] .FindControl. – Mantorok

Répondre

2

Ok, la meilleure chose à faire est de mettre en œuvre un gestionnaire pour OnDataBound, faire quelque chose comme:

protected void databound(object sender, EventArgs e) 
    { 
    if (DetailsView1.CurrentMode == DetailsViewMode.Edit) 
    { 
     var control = DetailsView1.Rows[0].Cells[1].FindControl("chkboxTest"); 
     if (control != null) 
     { 
      // Write some JS... 
     } 
    } 
    } 
+0

Salut Mantorok. Je vous remercie! Cela va résoudre mon problème. Pendant cet événement, le contrôle sera trouvé. Merci pour votre temps et vos réponses! – robertpnl

0

vide DetailsView1_ModeChanged (expéditeur d'objet, EventArgs e) { if (DetailsView1.CurrentMode == DetailsViewMode.Edit) var chkbox = DetailsView1.Rows [0] .FindControl ("chkxboxTest"); // < == est nul }

Le texte incrémenté est-il une faute de frappe?

Je n'ai pas eu beaucoup d'utilisation de DetailsView, mais nous utilisons Rows [0] n'est pas une ligne d'en-tête, et y a-t-il des cellules sous les lignes? Comme le GridView. MISE À JOUR: Je suppose que tout ce que vous voulez faire est de capturer le contrôle après que l'utilisateur a mis à jour les éléments? Attribuer un gestionnaire d'événements à OnItemUpdating et effectuez les opérations suivantes:

protected void updating(object sender, DetailsViewUpdateEventArgs e) 
{ 
    var control = DetailsView1.Rows[int.Parse(e.CommandArgument.ToString())].Cells[1].FindControl("chkboxTest"); 
} 
+0

Désolé, faute de frappe, événement modifié mais toujours nul – robertpnl

+0

Salut @Mantorok Vos informations de mise à jour sont utiles, mais l'événement ItemUpdating être viré quand l'utilisation frappe le lien/bouton de mise à jour et, désolé de vous le dire, j'aime obtenir le clientID pendant le changement de mode pour éditer afin que je puisse init javascript pendant le mode d'édition – robertpnl

+0

robertpnl. Si c'est alors DetailsView1.Rows [0] .Cells [1] .FindControl ("chkboxTest") devrait suffire – Mantorok