C#通过自定义按钮类传递数据集不';行不通

C#通过自定义按钮类传递数据集不';行不通,c#,excel,button,dataset,click,C#,Excel,Button,Dataset,Click,我试图通过按钮调用一个方法,但问题是我需要在点击按钮时传递一个日期集,因为它将在方法中使用。因此,我创建了一个自定义按钮类,它将数据集传递给该方法。此方法将从数据集中的表创建excel文档 当在页面加载中直接调用此方法时,它工作正常,但我希望在单击“导出到Excel”时创建Excel文档。问题是数据集“set”似乎没有正确地通过click事件传递。我想问题在于按钮类 有人知道如何解决这个问题吗?数据集似乎在前往createExcel方法的途中丢失 我在方法内的第一个for循环(在dataset.

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

当在页面加载中直接调用此方法时,它工作正常,但我希望在单击“导出到Excel”时创建Excel文档。问题是数据集“set”似乎没有正确地通过click事件传递。我想问题在于按钮类

有人知道如何解决这个问题吗?数据集似乎在前往createExcel方法的途中丢失

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

受保护的无效页面加载(对象发送方,事件参数e)
{
DataTable1=新的DataTable();
表1.列。添加(“表1_Col1”);
表1.列。添加(“表1_Col2”);
表1.行。添加(“表1_行1_项1”、“表1_行1_项2”);
表1.行。添加(“表1_行2_项1”、“表1_行1_项2”);
DataTable2=新的DataTable();
表2.列。添加(“表2_Col1”);
表2.列。添加(“表2_Col2”);
表2.行。添加(“表2_行1_项1”、“表1_行1_项2”);
表2.行。添加(“表2_行2_项1”、“表1_行1_项2”);
数据集集=新数据集();
集合。表格。添加(表1);
集合。表格。添加(表2);
Write(set.GetXml());
MyButton btnExcel=新建MyButton();
btnExcel.DsDataSet=set;
btnExcel.ID=“excel”;
btnExcel.Text=“导出到Excel”;
btnExcel.Click+=neweventhandler(此.Button1Click);
表格1.控件.添加(btnExcel);
}
受保护的无效按钮1单击(对象发送者、事件args args)
{
数据集ds=(发送方作为数据集);
创建Excel(ds);
}
受保护的void createExcel(数据集)
{
//使用Ofice互操作打印
Excel.Application Excel=新建Excel.Application();
var工作簿=(Excel.u工作簿)(Excel.Workbooks.Add(Missing.Value));
//对象引用未设置为对象的实例
对于(var i=0;i如果(workbook.Sheets.Count该行导致异常:

DataSet ds = (sender as DataSet);
参数
sender
页面
对象,而不是
数据集
,这将导致
ds
被分配一个空值

在您的代码中,
set
是一个局部变量。最简单的解决方案是将
set
提升到
页面
的一个字段,以便在调用
按钮1click
时,该字段在范围内。可以这样做:

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\u Load
Button1Click
之前被调用。在上面的代码中,
Page\u Load
初始化
set
到所需的数据集。当调用
Button1Click
时,它可以简单地引用
set
来获得初始化的
数据集
实例。这是随后的结果您不必显式地将数据集作为参数传递给
按钮1click

,因此在页面上\u加载为什么您要尝试调用按钮Click也让您实际遍历了代码..?
受保护的无效按钮1click
在此方法中放置断点这是web应用还是winforms应用..?直到this
btnExcel.Click+=neweventhandler(this.Button1Click);form1.Controls.Add(btnExcel);
不太清楚为什么要添加或创建一个新按钮,但我可以在测试您所拥有的一切时看到数据,直到您创建这个从
按钮继承的奇数类为止。请确认您调试了代码
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);
}