C# 将嵌套的Gridview导出到Excel错误
我需要使用从搜索中获得的以下代码将嵌套的Gridview导出到Excel,但当我单击“导出”按钮时,它引发了一个错误: 中发生“System.ArgumentOutOfRangeException”类型的异常 mscorlib.dll,但未在用户代码中处理 代码如下:C# 将嵌套的Gridview导出到Excel错误,c#,asp.net,excel,gridview,C#,Asp.net,Excel,Gridview,我需要使用从搜索中获得的以下代码将嵌套的Gridview导出到Excel,但当我单击“导出”按钮时,它引发了一个错误: 中发生“System.ArgumentOutOfRangeException”类型的异常 mscorlib.dll,但未在用户代码中处理 代码如下: protected void ExportExcel(object sender, EventArgs e) { DataTable dt = new DataTable("GridView
protected void ExportExcel(object sender, EventArgs e)
{
DataTable dt = new DataTable("GridView_Data");
GridView grvPayrollDetails = (GridView)grvPayroll.Rows[1].FindControl("grvPayrollDetails");
foreach (TableCell cell in grvPayroll.HeaderRow.Cells)
{
dt.Columns.Add(cell.Text);
}
foreach (TableCell cell in grvPayrollDetails.HeaderRow.Cells)
{
dt.Columns.Add(cell.Text);
}
dt.Columns.RemoveAt(0);
foreach (GridViewRow row in grvPayroll.Rows)
{
GridView grvPayrollDetailscell = (row.FindControl("grvPayrollDetails") as GridView);
for (int j = 0; j < grvPayrollDetailscell.Rows.Count; j++)
{
dt.Rows.Add(row.Cells[1].Text, row.Cells[2].Text, grvPayrollDetailscell.Rows[j].Cells[0].Text, grvPayrollDetailscell.Rows[j].Cells[1].Text);
}
}
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt);
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=grvPayrollDetails.xlsx");
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();
}
}
}
受保护的void ExportExcel(对象发送方,事件参数e)
{
DataTable dt=新的DataTable(“GridView_数据”);
GridView grvPayrollDetails=(GridView)grvPayroll.Rows[1]。FindControl(“grvPayrollDetails”);
foreach(grvPayroll.HeaderRow.Cells中的表格单元格)
{
dt.Columns.Add(cell.Text);
}
foreach(grvPayrollDetails.HeaderRow.Cells中的TableCell单元格)
{
dt.Columns.Add(cell.Text);
}
dt.Columns.RemoveAt(0);
foreach(grvPayroll.Rows中的GridViewRow行)
{
GridView grvPayrollDetailscell=(作为GridView的row.FindControl(“grvPayrollDetails”);
对于(int j=0;j
grvPayroll是主Gridview,Gridview grvPayrollDetails是嵌套的子Gridview。请帮忙!
我遵循了这个指南:
这是嵌套的Gridview:
更改以下行
GridView grvPayrollDetails=(GridView)grvPayroll.Rows[1]。FindControl(“grvPayrollDetails”)代码>包含以下代码
GridView grvPayrollDetails = null;
foreach (GridViewRow row in grvPayroll.Rows)
{
if (row.HasControls())
{
foreach (Control ctrl in row.Controls)
{
if (ctrl.ID == "grvPayrollDetails" && grvPayrollDetails != null)
{
grvPayrollDetails = (GridView)ctrl;
break;
}
}
if (grvPayrollDetails != null)
{
break;
}
}
}
您应该修改for循环以运行count-1,并使用if条件检查行。单元格应为=3
for (int j = 0; j < grvPayrollDetailscell.Rows.Count - 1; j++)
{
if(row.Cells.Count >= 3)
{
dt.Rows.Add(row.Cells[1].Text, row.Cells[2].Text, grvPayrollDetailscell.Rows[j].Cells[0].Text, grvPayrollDetailscell.Rows[j].Cells[1].Text);
试试这个:
public override void VerifyRenderingInServerForm(Control control)
{
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */
}
protected void ExportExcel(object sender, EventArgs e)
{
grvPayroll.AllowPaging = false;
var grvPayrollDetails = new GridView();
for (var i = 0; i < grvPayroll.Rows.Count; i++)
{
grvPayrollDetails = (GridView)grvPayroll.Rows[i].FindControl("grvPayrollDetails");
grvPayrollDetails.AllowPaging = false;
BindGrid(SortField);
}
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=PayrollExport.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
using (StringWriter sw = new StringWriter())
{
HtmlTextWriter hw = new HtmlTextWriter(sw);
grvPayrollDetails.AllowPaging = false;
this.BindGrid(SortField);
grvPayrollDetails.Font.Name = "Times New Roman";
grvPayrollDetails.BackColor = Color.Transparent;
grvPayrollDetails.GridLines = GridLines.Both;
grvPayrollDetails.RenderControl(hw);
Response.Write(Regex.Replace(sw.ToString(), "(<a[^>]*>)|(</a>)", " ", RegexOptions.IgnoreCase));
Response.Flush();
Response.End();
}
}
public override void VerifyRenderingInServerForm(控件)
{
/*确认已为指定的ASP.NET呈现HtmlForm控件
运行时的服务器控件*/
}
受保护的void ExportExcel(对象发送方,事件参数e)
{
grvPayroll.allowpage=false;
var grvPayrollDetails=new GridView();
对于(变量i=0;i)|(),”,RegexOptions.IgnoreCase));
Response.Flush();
Response.End();
}
}
使用调试器!并检查超出范围的值。顺便问一下,在哪一行出现此异常?它在这一行引发了一个错误:GridView grvPayrollDetails=(GridView)grvPayroll.Rows[1]。FindControl(“grvPayrollDetails”);但我不明白为什么?所以您的gridview在该行之前确实有2行?我修改了代码,但在第行仍然得到相同的错误:gridview grvPayrollDetails=(gridview)grvPayroll.rows[1]。FindControl(“grvPayrollDetails”);是否添加了row.Cells.Count>=3个条件是的,添加了。但它在第行仍然得到相同的错误:GridView grvPayrollDetails=(GridView)grvPayroll.Rows[1].FindControl(“grvPayrollDetails”);您好,我修改了代码以更正代码中的错误行。我尝试了所有代码,但都失败了。谢谢你的帮助,我尝试了另一种方法,没有错误发生,但我只得到了一个没有数据头的excel文件。请访问此帖子,也许您可以帮助我:
public override void VerifyRenderingInServerForm(Control control)
{
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */
}
protected void ExportExcel(object sender, EventArgs e)
{
grvPayroll.AllowPaging = false;
var grvPayrollDetails = new GridView();
for (var i = 0; i < grvPayroll.Rows.Count; i++)
{
grvPayrollDetails = (GridView)grvPayroll.Rows[i].FindControl("grvPayrollDetails");
grvPayrollDetails.AllowPaging = false;
BindGrid(SortField);
}
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=PayrollExport.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";
using (StringWriter sw = new StringWriter())
{
HtmlTextWriter hw = new HtmlTextWriter(sw);
grvPayrollDetails.AllowPaging = false;
this.BindGrid(SortField);
grvPayrollDetails.Font.Name = "Times New Roman";
grvPayrollDetails.BackColor = Color.Transparent;
grvPayrollDetails.GridLines = GridLines.Both;
grvPayrollDetails.RenderControl(hw);
Response.Write(Regex.Replace(sw.ToString(), "(<a[^>]*>)|(</a>)", " ", RegexOptions.IgnoreCase));
Response.Flush();
Response.End();
}
}