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行登録します.
ToolBarメソッドの作成:
エクスポートボタンイベント:
SharePointからExcelをエクスポートする完全なコードを次に示します.
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);
}
}
}