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 :
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