2010-10-30 6 views
3

J'ai GridView sur ma page asp.net, une colonne dans cette grille est ImageButton (TemplateField avec ID = "imbReserve"). En cliquant sur ce bouton, je veux afficher PopUp, mais quand je mets TargetControlId = "imbReserve", je reçois un message d'erreur "Un contrôle avec l'ID 'imbReserve' n'a pas pu être trouvé". Comment y parvenir, cliquez sur le bouton à l'intérieur de Grid show PopUp?PopUpExtender sur ImageButton à l'intérieur du problème GridView

+3

Hey avez-vous un problème sur la question de marquage comme réponse? – Lorenzo

Répondre

0

Le problème est lié au fait que l'ID réel est modifié lorsque la page est rendue au client.

Ouvrez votre source de page dans le navigateur et examinez l'ID généré à partir de asp.net. Utilisez ensuite cet ID dans la propriété TargetControlID

Ce genre de problème est présent avec tous les contrôles ASP.NET dans templated

Une façon plus propre sera de lier la propriété TargetControlID de la ModalPopupExtendr sur chargement de la page où vous pouvez utiliser la propriété ClientID dinamically généré

modalPopupExtender.TargetControlID = myTemplateControl.ClientID; 
6

Jetez un oeil à ces 2 articles, qui vient m'a aidé avec ce problème

Article 1:A More Traditional approach

Ce qui suit est une paraphrase de l'article ci-dessus

Le Code Page:

<asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate>    
     <asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" 
      Width="95%"> 
      <Columns> 
       <asp:TemplateField > 
        <ItemTemplate> 
         <asp:Button ID="btnViewDetails" runat="server" Text="Details" OnClick="BtnViewDetails_Click" /> 
        </ItemTemplate> 
        </asp:TemplateField> 
        <asp:BoundField DataField="customerid" HeaderText="ID" /> 
        <asp:BoundField DataField="companyname" HeaderText="Company" /> 
        <asp:BoundField DataField="contactname" HeaderText="Name" /> 
        <asp:BoundField DataField="contacttitle" HeaderText="Title" />     
      </Columns>      
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel>  

<ajaxToolKit:ModalPopupExtender 
      ID="mdlPopup" runat="server" TargetControlID="pnlPopup" PopupControlID="pnlPopup" 
      CancelControlID="btnClose" BackgroundCssClass="modalBackground" /> 
<asp:Panel ID="pnlPopup" runat="server" Width="500px" style="display:none"> 
    <asp:UpdatePanel ID="updPnlCustomerDetail" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
     [Your Content Here] 
     </ContentTemplate>     
      </asp:UpdatePanel> 
      <div align="right" style="width:95%"> 
       <asp:Button 
        ID="btnSave" runat="server" Text="Save" /> 
       <asp:Button ID="btnClose" runat="server" Text="Close" Width="50px" /> 
      </div>    
     </asp:Panel> 

Notez que le GridView est enveloppé dans un panneau de mise à jour que l'ID de contrôle cible pour le Modal Extender est le même que le Pop Up Control ID. C'est parce que ModalPopUp Extender a besoin d'un ID de contrôle cible et je pense que cette solution est un meilleur plan que d'utiliser un bouton caché.

Maintenant Pour le Code Derrière:

protected void BtnViewDetails_Click(object sender, EventArgs e) 
{ 
    // Do Anything you need to the contents of the update panel 

    // update the contents in the detail panel 
    this.updPnlCustomerDetail.Update(); 
    // show the modal popup 
    this.mdlPopup.Show(); 
} 

Article 2:Uses Clientside Javascript

Ce qui suit est une paraphrase de l'article ci-dessus

Le Javascript côté client

<script type="text/javascript"> 
    // keeps track of the delete button for the row 
    // that is going to be removed 
    var _source; 
    // keep track of the popup div 
    var _popup; 

    function showConfirm(source){ 
     this._source = source; 
     this._popup = $find('mdlPopup'); 

     // find the confirm ModalPopup and show it  
     this._popup.show(); 
    } 

    function okClick(){ 
     // find the confirm ModalPopup and hide it  
     this._popup.hide(); 
     // use the cached button as the postback source 
     __doPostBack(this._source.name, ''); 
    } 

    function cancelClick(){ 
     // find the confirm ModalPopup and hide it 
     this._popup.hide(); 
     // clear the event source 
     this._source = null; 
     this._popup = null; 
    } 

Page Code:

<asp:GridView ID="gvToDoList" runat="server" AutoGenerateColumns="false" > 
     <Columns> 
      <asp:BoundField DataField="ID" HeaderText="ID" /> 
      <asp:BoundField DataField="Item" HeaderText="Description" /> 
      <asp:BoundField DataField="IsCompleted" HeaderText="Complete?" /> 
      <asp:TemplateField ControlStyle-Width="50px" HeaderStyle-Width="60px" > 
       <ItemTemplate> 
        <asp:Button ID="btnDelete" runat="server" 
          OnClientClick="showConfirm(this); return false;" 
          OnClick="BtnDelete_Click" Text="Delete" /> 
       </ItemTemplate> 
      </asp:TemplateField>        
     </Columns>      
    </asp:GridView> 

    <ajaxToolKit:ModalPopupExtender BehaviorID="mdlPopup" runat="server" 
      TargetControlID="div" PopupControlID="div" 
      OkControlID="btnOk" OnOkScript="okClick();" 
      CancelControlID="btnNo" OnCancelScript="cancelClick();" 
      BackgroundCssClass="modalBackground" /> 
    <div id="div" runat="server" align="center" class="confirm" style="display:none"> 
     <img align="absmiddle" src="Img/warning.jpg" />Are you sure you want to delete this item? 
     <asp:Button ID="btnOk" runat="server" Text="Yes" Width="50px" /> 
     <asp:Button ID="btnNo" runat="server" Text="No" Width="50px" /> 
    </div> 

noter encore une fois que l'ID de contrôle cible pour le Modal Pop Up Extender est le même que le Pop Up ID Control. Notez également l'attribut OnClientClick sur le bouton dans le champ de modèle, assurez-vous que votre include "return false;". Tout ce qui est nécessaire dans le code derrière le gestionnaire d'événements onClick (ou onCommand) est nécessaire pour faire ce que vous devez faire.

J'ai essayé ces deux approches avec succès.

Espérons qu'un de ces deux travaux pour vous.