C# 通过自定义按钮类传递数据集不起作用

本文关键字:数据集 不起作用 按钮 自定义 | 更新日期: 2023-09-27 18:30:38

我正在尝试通过按钮调用方法,但问题是我在修剪按钮时需要传递 DateSet,因为它将在方法中使用。因此,我创建了一个自定义按钮类,该类将数据集传递给该方法。此方法将从数据集中的表创建一个 Excel 文档。

当直接在Page_Load中调用此方法时,它工作正常,但是我想在单击"导出到Excel"时创建Excel文档。问题是数据集"集"似乎没有正确传递到点击事件。我想问题是按钮类。

安约知道如何解决这个问题吗?数据集似乎在通往 createExcel 方法的途中丢失了。

我收到错误:"对象引用未设置为对象的实例"在方法内的第一个 for 循环(在数据集上。表计数)。

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table1 = new DataTable();
        table1.Columns.Add("Table1_Col1");
        table1.Columns.Add("Table1_Col2");
        table1.Rows.Add("Table1_Row1_Item1", "Table1_Row1_Item2");
        table1.Rows.Add("Table1_Row2_Item1", "Table1_Row1_Item2");
        DataTable table2 = new DataTable();
        table2.Columns.Add("Table2_Col1");
        table2.Columns.Add("Table2_Col2");
        table2.Rows.Add("Table2_Row1_Item1", "Table1_Row1_Item2");
        table2.Rows.Add("Table2_Row2_Item1", "Table1_Row1_Item2");
        DataSet set = new DataSet();
        set.Tables.Add(table1);
        set.Tables.Add(table2);
        Response.Write(set.GetXml());
        MyButton btnExcel = new MyButton();
        btnExcel.DsDataSet = set;
        btnExcel.ID = "excel";
        btnExcel.Text = "Export to Excel";
        btnExcel.Click += new EventHandler(this.Button1Click);
        form1.Controls.Add(btnExcel);
    }
    protected void Button1Click(object sender, EventArgs args)
    {
        DataSet ds = (sender as DataSet);
        createExcel(ds);
    }
    protected void createExcel(DataSet dataset)
    {
        //Print using Ofice InterOp
        Excel.Application excel = new Excel.Application();
        var workbook = (Excel._Workbook)(excel.Workbooks.Add(Missing.Value));
        // Object reference not set to an instance of an object
        for (var i = 0; i < dataset.Tables.Count; i++)
        {
            if (workbook.Sheets.Count <= i)
            {
                workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            }
            //NOTE: Excel numbering goes from 1 to n
            var currentSheet = (Excel._Worksheet)workbook.Sheets[i + 1];
            for (var y = 0; y < dataset.Tables[i].Rows.Count; y++)
            {
                for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++)
                {
                    currentSheet.Cells[y + 1, x + 1] = dataset.Tables[i].Rows[y].ItemArray[x];
                }
            }
        }
        string outfile = @"C:'Windows'SysWOW64'config'systemprofile'Desktop'EXCEL_TEST.xlsx";
        workbook.SaveAs(outfile, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing);
        workbook.Close();
        excel.Quit();
    }
}
public class MyButton : Button
{
    private DataSet m_DsDataSet;
    public DataSet DsDataSet
    {
        get { return m_DsDataSet; }
        set { m_DsDataSet = value; }
    }
}

C# 通过自定义按钮类传递数据集不起作用

异常由以下行产生:

DataSet ds = (sender as DataSet);

参数 sender 是一个 Page 对象,而不是一个 DataSet ,这将导致ds被分配一个空值。

在代码中,set是一个局部变量。 最简单的解决方案是将set提升到Page的字段,以便在调用Button1Click时它在范围内。 这可以像这样完成:

DataSet set; // set is a field of the class, rather than a local variable
protected void Page_Load(object sender, EventArgs e)
{
    DataTable table1 = new DataTable();
    ** Lines removed **
    this.set = new DataSet(); // set should be an instance variable
    set.Tables.Add(table1);
    set.Tables.Add(table2);
    ** Lines removed **
}
protected void Button1Click(object sender, EventArgs args)
{
    DataSet ds = this.set;
    createExcel(ds);
}

Page_Load在页面加载时Button1Click之前调用。 在上面的代码中,Page_Load初始化set到所需的数据集。 调用 Button1Click 时,只需引用set即可获取初始化的DataSet实例。 因此,没有必要将数据集作为参数显式传递给Button1Click