我的DataGridView在为其设置DataSource后为空

本文关键字:DataSource 设置 DataGridView 我的 | 更新日期: 2023-09-27 18:20:17

我有一个函数,它获取DataGridView作为参数,并将其数据导出到excel:

public Worksheet exportToExcel(DataGridView dgv)

我想对DataTable执行同样的操作,所以我编写了以下函数:

public Worksheet exportToExcel(System.Data.DataTable dataTable)
{
    DataGridView dgv = new DataGridView();
    dgv.DataSource = dataTable;
    return exportToExcel(dgv);
}

但是当我运行第二个函数时,DataGridView没有任何列和行。我确信我的DataTable有数据,当我在窗体上显示data_GridView时,一切都正常。

这是我的exportToExcel函数:

public Worksheet exportToExcel(DataGridView dgv)
{
    //create excel application
    Microsoft.Office.Interop.Excel.Application excelApplication = new ApplicationClass();
    excelApplication.Visible = false;
    //open excel template file
    object template = AppDomain.CurrentDomain.BaseDirectory + "Reports/Excel/General.xltx";
    Workbook excelWorkbook = excelApplication.Workbooks.Add(template);
    Worksheet excelWorksheet = (Worksheet)excelWorkbook.Worksheets.get_Item("Sheet1");
    //exporting column headers
    for (int i = 0; i < dgv.Columns.Count; i++)
    {
        excelWorksheet.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
    }
    //exporting data
    for (int i = 0; i < dgv.Rows.Count; i++)
    {
        for (int j = 0; j < dgv.Columns.Count; j++)
        {
            excelWorksheet.Cells[i + 2, j + 1] = dgv.Rows[i].Cells[j].Value;
        }
    }
    //draw border for each cell
    Range range = excelWorksheet.get_Range("A1", excelWorksheet.Cells[dgv.Rows.Count + 1, dgv.Columns.Count]);
    range.Borders[XlBordersIndex.xlInsideHorizontal].LineStyle = XlLineStyle.xlContinuous;
    range.Borders[XlBordersIndex.xlInsideVertical].LineStyle = XlLineStyle.xlContinuous;
    range.BorderAround(Type.Missing, XlBorderWeight.xlThick, XlColorIndex.xlColorIndexAutomatic, Type.Missing);
    //resize columns automatically based on their data
    excelWorksheet.Columns.AutoFit();
    //show excel application
    excelApplication.Visible = true;
    return excelWorksheet;
}

我的DataGridView在为其设置DataSource后为空

"当我在窗体上显示DataGridView时,一切都好"

为了读取(迭代)数据网格视图的行/列,需要将其添加到控件(Form/UserControl)中。我以为它也需要画出来,但事实并非如此。这意味着您可以在调用exportToExcel之前将DataGridView添加到新表单中,然后处理表单和DataGridView。

public Worksheet exportToExcel(System.Data.DataTable dataTable)
{
    //Wrap in using statements to make sure controls are disposed
    using (Form frm = new Form())
    {
        using(DataGridView dgv = new DataGridView())
        {   
            //Add dgv to form before setting datasource                             
            frm.Controls.Add(dgv);  
            dgv.DataSource = dataTable;   
            return exportToExcel(dgv);
        }
    }   
}

这应该是可行的,但我想指出的是,这不是我建议的解决方案。我将创建一个exportToExcel方法将DataTable作为参数。