SharePointでGridViewがExcelボタンをエクスポートする問題を解決する

4255 ワード

みんな知ってるASP.NETでGridViewがExcelをエクスポートする方法.SharePointでSPGridViewはGridViewを継承する拡張コントロールであり、ASP.NETでのエクスポート方法はSharePointでも適用されるはずです.はい、使えますが、一つ問題があります.初めてボタンをクリックしてエクスポートに成功した後、もう一度ボタンをクリックすると、ボタンが役に立たないということです.そこでGoogleは、このExport GridView to Excel in web partの投稿を見つけて問題を解決しました.Page_LoadにJavascriptスクリプトを2行登録します.
protected void Page_Load(object sender, EventArgs e)

{

    this.CreateToolBar();



    string script = "_spOriginalFormAction = document.forms[0].action;
_spSuppressFormOnSubmitWrapper = true;"; this.ClientScript.RegisterClientScriptBlock(this.GetType(), "script", script, true); }

ToolBarメソッドの作成:
private void CreateToolBar()

{

    ToolBar toolBar = (ToolBar)Page.LoadControl("~/_controltemplates/ToolBar.ascx");



    ToolBarButton btnExportToExcel = (ToolBarButton)Page.LoadControl("~/_controltemplates/ToolBarButton.ascx");

    btnExportToExcel.ID = "btnExportToExcel";

    btnExportToExcel.Text = "Export to Spreadsheet";

    btnExportToExcel.ImageUrl = "/_layouts/images/icxls.gif";

    btnExportToExcel.Click += new EventHandler(btnExportToExcel_Click);



    toolBar.Buttons.Controls.Add(btnExportToExcel);

    this.Toolbar.Controls.Clear();

    this.Toolbar.Controls.Add(toolBar);

}


エクスポートボタンイベント:
void btnExportToExcel_Click(object sender, EventArgs e)

{

    ExportToExcel("SearchResults", gvSearchResults);

}


SharePointからExcelをエクスポートする完全なコードを次に示します.
protected void ExportToExcel(string fileName, GridView gv)

{

    Response.Clear();

    Response.Charset = "GB2312";

    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));

    Response.ContentType = "application/ms-excel";



    using (TextWriter tw = new StringWriter())

    {

        using (HtmlTextWriter htw = new HtmlTextWriter(tw))

        {

            Table table = new Table();

            table.GridLines = gv.GridLines;



            if (gv.HeaderRow != null)

            {

                PrepareControlForExport(gv.HeaderRow);

                table.Rows.Add(gv.HeaderRow);

            }



            foreach (GridViewRow row in gv.Rows)

            {

                PrepareControlForExport(row);

                table.Rows.Add(row);

            }



            if (gv.FooterRow != null)

            {

                PrepareControlForExport(gv.FooterRow);

                table.Rows.Add(gv.FooterRow);

            }



            table.RenderControl(htw);



            Response.Write(tw.ToString());

            Response.End();

        }

    }

}



private void PrepareControlForExport(Control control)

{

    for (int i = 0; i < control.Controls.Count; i++)

    {

        Control current = control.Controls[i];



        if (current is LinkButton)

        {

            control.Controls.Remove(current);

            control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));

        }

        else if (current is ImageButton)

        {

            control.Controls.Remove(current);

            control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));

        }

        else if (current is HyperLink)

        {

            control.Controls.Remove(current);

            control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));

        }

        else if (current is DropDownList)

        {

            control.Controls.Remove(current);

            control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));

        }

        else if (current is CheckBox)

        {

            control.Controls.Remove(current);

            control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));

        }



        if (current.HasControls())

        {

            PrepareControlForExport(current);

        }

    }

}