承辦希望能讓民眾把gridview表格下載回家(?),所以額外做的功能,其中下載下來的GridView不需要超連結需另外處理,也因為這樣原本用的<a></a>不能用要改用HyperLink,又卡住多載變數......
前台就只是一個button而已
<center>
<asp:Button ID="btnExcel" runat="server" Text="Excel下載" onclick="btnExcel_Click" />
</center>
後台的部分,基本上是照co的,網路上資料不少,但因為原本的gridview有超連結,下載下來的excel不需要所以做額外處理,想法是再給一個藏起來的label存一樣的東西,當點擊下載後把超連結藏起來把label放出來,但利用findcontrol抓控制項卻失敗,原因似乎是必須像下面這樣
protectedvoid rptData_ItemDataBound(object source,RepeaterCommandEventArgs e)
{
HtmlAnchor a1 =(HtmlAnchor)e.Item.FindControl("a1");
a1.HRef="www.mySite.com/mypage.aspx";
}
其中的 e.Item.FindControl 貌似一定得在 RepeaterCommandEventArgs e 底下做,
而 button 是 EventArgs e 所以不能用,也可以做在 databound 的時候,
但這樣要改的範圍太大了,就直接改成用 HyperLink 做了。
後台裡面其中最後一個涵式 public override void VerifyRenderingInServerForm(Control control)
裡面不用放東西,跟著下載一起的,避免runat="server"錯誤。
後台的部分。用CASE是因為我有三個gridview對應三種不同情形,如果只是單純的gridview下載就直接從
Response.ClearContent();
往下複製就可以了。
protected void btnExcel_Click(object sender, EventArgs e)
{
GridView oGv;
switch (D5C2_ID)
{
case "0012":
oGv = GV_Details_MedicinebagMarked;
break;
case "0013":
oGv = GV_Details_FeeReceipt;
break;
default:
oGv = GV_List;
break;
}
Response.ClearContent();
Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
string excelFileName = "統計資料Excel檔案下載.xls";
Response.AddHeader("content-disposition", "attachment;filename=" + Server.UrlEncode(excelFileName));
Response.ContentType = "application/excel";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
for (int i = 0; i < oGv.Rows.Count; i++)
{
HyperLink lblHospName = (HyperLink)oGv.Rows[i].FindControl("lblHospName");
Label Label2 = (Label)oGv.Rows[i].FindControl("Label2");
lblHospName.Visible = false;
Label2.Visible = true;
}
oGv.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{
// 配合Excel下載放的
}
裡面的for迴圈,是因為gridview原本有一欄是超連結,所以下載下來的excel也會有超連結,但不需要超連結,所以要把超連結拿掉 做法是放一個隱藏的label,存和超連結一樣的文字,當下載時,隱藏超連結再把label放出來就好 但要改東西。
原本是
<asp:TemplateField HeaderText="醫事機構名稱">
<ItemTemplate>
<asp:Label ID="lblHospName" runat="server">
<a href='View.aspx?HospID=<%# DataBinder.Eval(Container.DataItem, "Hosp_ID")%>&YYQN=<%= rYYQN %>&Q5C1_ID=<%= D5C1_ID %>' ><%# DataBinder.Eval(Container.DataItem, "Hosp_Name")%></a></asp:Label>
</ItemTemplate>
</asp:TemplateField>
更改後為
<asp:TemplateField HeaderText="醫事機構<br />名稱">
<ItemTemplate>
<asp:HyperLink ID="lblHospName" runat="server" NavigateUrl='<%# "View.aspx?HospID="+DataBinder.Eval(Container.DataItem,"Hosp_ID")+"&YYQN="+rYYQN+"&Q5C1_ID="+D5C1_ID %>'Text='<%# DataBinder.Eval(Container.DataItem, "Hosp_Name")%>'/>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("Hosp_Name")%>' Visible="false"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
沒有留言:
張貼留言