2010-07-16 6 views
1

Comment utiliser un GridView TemplateField contenant un LinkButton qui doit afficher le modal sur click? J'ai des rangées de données dont je veux mettre à jour les détails lorsque vous cliquez sur le bouton 'Edit' LinkButton dans cette rangée. Il y a un tas de données que je dois charger via codebehind juste avant les affichages Modal.ModalPopupExtender dans un ItemTemplate GridView

Je tentais ce qui suit, mais je ne peux pas faire Modal1.Show() dans le gestionnaire d'événements, car il est dans un TemplateField:

<ItemTemplate> 
    <asp:Button runat="server" ID="HiddenForModal" style="display: none" /> 
    <ajaxToolkit:ModalPopupExtender ID="Modal1" runat="server" TargetControlID="HiddenForModal" PopupControlID="pnlModal" /> 
    <asp:LinkButton ID="btnEdit" runat="server" Text="Edit" onclick="btnEdit_Click" /> 
    <asp:LinkButton ID="btnDelete" runat="server" Text="Delete"></asp:LinkButton> 
</ItemTemplate> 

Merci, Mark

Répondre

3

La clé est de savoir quelle ligne dans la GridView était le LinkButton sur lequel vous avez cliqué. Vous pouvez le faire de plusieurs façons, mais la façon dont je l'ai implémenté est de le capturer dans l'événement RowCommand. Ensuite, vous pouvez accéder à ModalPopupExtender dans la ligne cliquée via FindControl (..).

Page:

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:Button ID="Button1" runat="server" style="Display:none;" Text="Button" /> 
    <cc1:ModalPopupExtender ID="ModalPopupExtender1" PopupControlID="Popup1" TargetControlID="Button1" BackgroundCssClass="modalBackground" runat="server" /> 
    <asp:LinkButton ID="LinkButton1" CommandName="Popup" runat="server">Popup</asp:LinkButton> 
    </ItemTemplate> 
</asp:TemplateField> 

Codebehind:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      LinkButton LinkButton1 = (LinkButton)e.Row.FindControl("LinkButton1"); 
      LinkButton1.CommandArgument = e.Row.RowIndex.ToString(); 
     } 
    } 

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Popup" && e.CommandArgument != null) 
     { 
      int rowIndex = Convert.ToInt32(e.CommandArgument); 
      ModalPopupExtender modalPopupExtender1 = (ModalPopupExtender)GridView1.Rows[rowIndex].FindControl("ModalPopupExtender1"); 
      modalPopupExtender1.Show(); 

      //Perform any specific processing. 
      Label1.Text = string.Format("Row # {0}", rowIndex); 
     } 
    } 

De plus, parce que vous ouvrez le modal sur un postback de toute façon vous n'avez pas besoin en fait le ModalPopupExtender (ou le bouton caché) dans la ItemTemplate. Vous pouvez le déplacer et le mettre sur la page (par votre div popup) et pouvez simplement appeler la méthode Show().

Page:

<asp:TemplateField> 
    <ItemTemplate> 
    <asp:LinkButton ID="LinkButton1" CommandName="Popup" runat="server">Popup</asp:LinkButton> 
    </ItemTemplate> 
</asp:TemplateField> 

CodeBehind:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Popup" && e.CommandArgument != null) 
     { 
      int rowIndex = Convert.ToInt32(e.CommandArgument); 
      ModalPopupExtender1.Show();     

      //Perform any specific processing 
      Label1.Text = string.Format("<Br>Row # {0}", rowIndex); 
     } 
    } 

Merci, bonne chance!

+0

J'ai essayé plusieurs façons d'y arriver. Le délégué RowDataBound configure tout correctement avec les numéros de ligne appropriés. Mais lors du clic sur LinkButton, l'extension s'affiche toujours sans publication dans le délégué RowCommand. Qu'est-ce qui ne va pas? – IAmAN00B