Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将嵌套的Gridview导出到Excel错误_C#_Asp.net_Excel_Gridview - Fatal编程技术网

C# 将嵌套的Gridview导出到Excel错误

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

我需要使用从搜索中获得的以下代码将嵌套的Gridview导出到Excel,但当我单击“导出”按钮时,它引发了一个错误:

中发生“System.ArgumentOutOfRangeException”类型的异常 mscorlib.dll,但未在用户代码中处理

代码如下:

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();
            }

        }