承辦希望能讓民眾把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>
沒有留言:
張貼留言