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

时间:2014-11-17 02:29:51

标签: c# excel button dataset click

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

直接在Page_Load中调用此方法时,它工作正常,但我想在单击“导出到Excel”时创建Excel文档。问题是DataSet“set”似乎没有通过click事件正确传递。我猜问题是Button Class。

anyoe知道如何解决这个问题吗?在通往createExcel方法的过程中,DataSet似乎丢失了。

我在方法的第一个for循环上得到错误:“对象引用没有设置为对象的实例”(在dataset.Tables.Count上)。

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

}

1 个答案:

答案 0 :(得分:0)

该行的异常结果:

DataSet ds = (sender as DataSet);

参数senderPage个对象,而不是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_Loadset初始化为所需的数据集。调用Button1Click时,只需引用set即可获取已初始化的DataSet实例。因此,没有必要将数据集明确地作为参数传递给Button1Click

相关问题