2012年10月29日 星期一

GridView轉excel下載、HyperLink多載變數、excel下載拿掉超連結

承辦希望能讓民眾把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>

沒有留言:

張貼留言