我有两个控件,分别是“搜索”按钮和“导出”按钮。用户将“搜索”数据并将数据插入到DataTable中并绑定到GridView或Repeater,然后当用户单击“导出”时,DataTable将传递到将使用DataTable中的数据生成Excel文件的类中
在我当前的代码中,“搜索”按钮和“导出”按钮都将查询以从数据库中获取数据。但我需要的只是搜索按钮,它将查询并将数据存储到DataTable或其他东西,当点击导出按钮时,它将使用早期数据生成Excel文件。
这是我目前的代码: Report.aspx
<asp:GridView ID="GridView1" runat="server">
<Columns>
</Columns>
</asp:GridView>
</body>
Report.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
/* Page load */
}
protected void btn_search_Click(object sender, EventArgs e)
{
DataTable dt = GetData();
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected DataTable GetData()
{
DataTable dataTable = new DataTable();
/* Query operation */
adapter.Fill(dataTable);
return dataTable;
}
protected void btn_export_Click(object sender, EventArgs e)
{
var excelClass = new ExcelClass();
excelClass.ExcelData = GetData();
}
我尝试在“Report.aspx.cs”中创建一个DataTable作为属性,并在单击“搜索”时将其填入数据中。但是当我导出时,DataTable再次为空。
DataTable dataTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
/* Page load */
}
protected void btn_search_Click(object sender, EventArgs e)
{
GetData();
GridView1.DataSource = dataTable ;
GridView1.DataBind();
}
protected void GetData()
{
/* Query operation */
adapter.Fill(dataTable);
}
protected void btn_export_Click(object sender, EventArgs e)
{
var excelClass = new ExcelClass();
excelClass.ExcelData = dataTable;
}
但是,我需要在点击搜索时只获取一次数据,并在导出时再次使用数据,因此它不会向数据库查询两次。
答案 0 :(得分:1)
如下所述,有三种方法可以实现此目的。
- 使用会话
醇>
您可以使用会话,但这会影响应用程序/页面的性能,例如,如果dataTable包含10,000条记录。
将dataTable添加到会话中:
DataTable dataTable= new DataTable();
dataTable= GetData();
Session.Add("dataTable", dataTable);
从会话中回复该数据表:
DataTable dataTable = Session["dataTable"] as DataTable
或
DataTable dataTable= (DataTable)Session["dataTable"];
- 将GridView1.DataSource导出到dataTable
醇>
DataTable dataTable= Gridview1.DataSource as DataTable;
- 将每行从GridView迭代到DataTable
醇>
//Create a new DataTable.
DataTable dataTable = new DataTable();
//Add columns to DataTable.
foreach (TableCell cell in GridView1.HeaderRow.Cells)
{
dataTable.Columns.Add(cell.Text);
}
//Loop through the GridView and copy rows.
foreach (GridViewRow row in GridView1.Rows)
{
dataTable.Rows.Add();
for (int i = 0; i < row.Cells.Count; i++)
{
dataTable.Rows[row.RowIndex][i] = row.Cells[i].Text;
}
}