Search code examples
asp.netrepeaterexport-to-excelxlsexport-to-csv

Repeater to xls exports my repeater buttons too into the xls


i Have repeater connected to my database and i want to export its data into xls file . i was able to do that ,except that since my repater contains a control button to manipulate the row (deleting) my xls is rendered with this button.

<asp:Repeater ID="Repeater1" runat="server"   EnableTheming="true"onitemcommand="Repeater1_ItemCommand" >
    <HeaderTemplate>
            <table class="datatable fullwidthpercent"> 
               <tr>
                   <td>ID</td>                     
                   <td> Nom</td>                             
                   <td>Prénom</td>                              
                   <td>Email</td>                      
                   <td>Adresse</td>
                   <td>Ville</td>
                   <td>Tél</td>
               </tr>

    </HeaderTemplate>
        <ItemTemplate>

               <tr>
                   <td><%# Eval("id") %></td>                           
                   <td><%# Eval("nom") %></td>                         
                   <td><%# Eval("prenom") %></td>                         
                   <td><%# Eval("email") %></td>
                   <td><%# Eval("adresse") %></td>
                   <td><%# Eval("ville") %></td>
                   <td><%# Eval("tel") %></td>
                   <td><asp:Button ID="Btn1" runat="server" CommandArgument= ' <%# Eval("id") %> ' Text="Eliminer" OnClick = "buttonEliminer_click" ></asp:Button></td>                   
               </tr>                  

        </ItemTemplate>
        <SeparatorTemplate>
        <tr>
        <td colspan="6"><hr /></td>
        </tr>
        </SeparatorTemplate>
        <FooterTemplate>
           </table>
        </FooterTemplate>
</asp:Repeater>
</div>

Code Behind :

  protected void ButtonExporter_Click(object sender, EventArgs e)
    {

        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=Gagnants.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";

        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
        Repeater1.RenderControl(htmlWrite);
        Response.Write("<table>");
        Response.Write(stringWrite.ToString());
        Response.Write("</table>");
        Response.End();

    }

overriding method to get over the form balise problem when rendering a repeter with inside control :

public override void VerifyRenderingInServerForm(Control control)
    {
        /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
           server control at run time. */
    }

and i get this at the output xls : enter image description here


Solution

  • Basically, you need to implement code that sets the button's (Btn1) visibility to false. When a server control's visibility is set to false, it is not rendered on the page.

    I would suggest the following code changes:

    First, create a page-level variable that determines what you are rendering to. You want to set this to default to true, since that is your default status (rendering to the screen)

    private bool _IsRenderForScreen = true;
    public property bool IsRenderForScreen {
       get {
          return this._IsRenderForScreen;
       }
       set {
          this._IsRenderForScreen = value;
       }
    }
    

    Then, in the ButtonExporter_Click method, set this variable to false:

    this.IsRenderForScreen = false;
    

    Then hook into the repeater's ItemDataBound event:

    <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound" ...
    

    Then add the following method to handle the event:

    public void Repeater1_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
            if(!this.IsRenderForScreen) {
                ((Button)e.Item.FindControl("Btn1")).Visible = false;
            }
        }
    }
    

    HTH. Let me know if anything is unclear