下载选定的Gridview的行来优化

我需要将一个asp.net gridview的选定行下载到Excel工作表中。 我正在做的是一次尝试所有的检查或只是select一些,然后按下面的下载button后,所有选定的行被下载为excel。 当我按下载button时,所有的东西都可以正常工作,而所有的行都会被忽略。 网格视图示例 以下是我的代码

public void ExportGridToExcel(GridView grdGridView, string fileName) { Response.Clear(); Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", fileName)); Response.Charset = ""; Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.ContentType = "application/vnd.xls"; StringWriter stringWriter = new StringWriter(); HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); // I Tried using following (but with no success) //-----Trial Starts---------------- //foreach (GridViewRow gvr in gvProgramList.Rows) // { // CheckBox cbox = (CheckBox)gvr.FindControl("cboxSelect"); // if(cbox.Checked) // gvr.Visible = true; // else // gvr.Visible = false; // } //--------Trial ends--------------- grdGridView.DataBind(); ClearControls(grdGridView); // Throws exception: Control 'ComputerGrid' of type 'GridView' // must be placed inside a form tag with runat=server. // ComputerGrid.RenderControl(htmlWrite); // Alternate to ComputerGrid.RenderControl above System.Web.UI.HtmlControls.HtmlForm form = new System.Web.UI.HtmlControls.HtmlForm(); Controls.Add(form); form.Controls.Add(grdGridView); form.RenderControl(htmlWriter); Response.Write(stringWriter.ToString()); Response.End(); foreach (GridViewRow gvr in gvProgramList.Rows) { CheckBox cbox = (CheckBox)gvr.FindControl("cboxSelect"); gvr.Visible = true; } grdGridView.DataBind(); } private void ClearControls(Control control) { for (int i = control.Controls.Count - 1; i >= 0; i--) { ClearControls(control.Controls[i]); } if (!(control is TableCell)) { if (control.GetType().GetProperty("SelectedItem") != null) { LiteralControl literal = new LiteralControl(); control.Parent.Controls.Add(literal); try { literal.Text = (string)control.GetType().GetProperty("SelectedItem"). GetValue(control, null); } catch { } control.Parent.Controls.Remove(control); } else if (control.GetType().GetProperty("Text") != null) { LiteralControl literal = new LiteralControl(); control.Parent.Controls.Add(literal); literal.Text = (string)control.GetType().GetProperty("Text"). GetValue(control, null); control.Parent.Controls.Remove(control); } } return; } protected void btnDownload_Click(object sender, EventArgs e) { if (gvProgramList.Rows.Count > 0) { ExportGridToExcel(gvProgramList, "ProgramList"); } } 

我可以build议你一个逻辑来做到这一点:

1.使用GridView的选定行创build一个dynamic数据表。 它只是循环访问gridview行,并将选定的行提取并附加到新的数据表中。

2.然后编写代码将这个新的数据表转换为excel表(大量的结果为谷歌“转换datatable到excel”)

 Try like the below code,hope it helps you.. 

在下载button单击事件,请调用此fn

 private void ExportToExcell() { DataTable dt = new DataTable(); dt.Columns.Add("Plan ID"); dt.Columns.Add("Plan Name"); dt.Columns.Add("Balance"); foreach (GridViewRow row in gdvBal.Rows) { CheckBox chkCalls = (CheckBox)row.FindControl("chkCalls"); if (chkCalls.Checked == true) { int i = row.RowIndex; Label lblPlanId = (Label)gdvBal.Rows[i].FindControl("lblPlanId"); Label lblPlanName = (Label)gdvBal.Rows[i].FindControl("lblPlanName"); Label lblBalance = (Label)gdvBal.Rows[i].FindControl("lblBalance"); DataRow dr = dt.NewRow(); dr["Plan ID"] = Convert.ToString(lblPlanId.Text); dr["Plan Name"] = Convert.ToString(lblPlanName.Text); dr["Balance"] = Convert.ToString(lblBalance.Text); dt.Rows.Add(dr); } } GridView gdvExportxls = new GridView(); gdvExportxls.DataSource = dt; gdvExportxls.DataBind(); Response.Clear(); Response.Buffer = true; Response.ContentType = "application/ms-excel"; Response.AddHeader("content-disposition", string.Format("attachment;filename=BillingForfBalances.xls", "selectedrows")); Response.Charset = ""; StringWriter stringwriter = new StringWriter(); HtmlTextWriter htmlwriter = new HtmlTextWriter(stringwriter); gdvExportxls.RenderControl(htmlwriter); Response.Write(stringwriter.ToString().Replace("<div>", " ").Replace("</div>", " ")); Response.End(); }