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; }
}
}
异常由以下行产生:
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
。