【发布时间】:2020-01-03 02:10:05
【问题描述】:
我正在尝试填充网格并从按钮的 OnClick 事件创建/下载 Excel 文件。创建/下载按预期工作,但我无法填充网格 - 除非我注释掉用于创建/下载 Excel 文件的代码。如果我这样做,它工作得很好,网格会按预期填充。如何让两者都使用同一个按钮的 OnClick 事件?我正在使用 VS2019,WebForms。
这是aspx代码:
<div class="row">
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 form-group">
<em>Begin Date and Time: </em>
<telerik:RadDateTimePicker ID="rdtpBeginDate" runat="server" Skin="Default" Width="100%">
<Calendar runat="server">
<SpecialDays>
<telerik:RadCalendarDay Repeatable="Today" ItemStyle-BackColor="#3399ff"></telerik:RadCalendarDay>
</SpecialDays>
</Calendar>
</telerik:RadDateTimePicker>
</div>
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 form-group">
<em>End Date and Time: </em>
<telerik:RadDateTimePicker ID="rdtpEndDate" runat="server" Skin="Default" Width="100%">
<Calendar runat="server">
<SpecialDays>
<telerik:RadCalendarDay Repeatable="Today" ItemStyle-BackColor="#3399ff"></telerik:RadCalendarDay>
</SpecialDays>
</Calendar>
</telerik:RadDateTimePicker>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 form-group">
<asp:Button Text="Export" OnClick="ExportExcel" runat="server" CssClass="btn btn-sm btn-primary" />
</div>
</div>
<hr />
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 form-group">
<asp:Label ID="lblScores" runat="server"></asp:Label>
<telerik:RadGrid
runat="server"
ID="rgScores"
AutoGenerateColumns="False">
<MasterTableView>
<Columns>
<telerik:GridBoundColumn DataField="Department" ReadOnly="True" HeaderText="Department" SortExpression="Department" UniqueName="Department" FilterControlAltText="Filter Department column" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="True"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="AuditCount" HeaderText="AuditCount" SortExpression="AuditCount" UniqueName="AuditCount" FilterControlAltText="Filter AuditCount column" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="True"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="AverageScore" HeaderText="AverageScore" SortExpression="AverageScore" UniqueName="AverageScore" FilterControlAltText="Filter AverageScore column" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" HeaderStyle-Font-Bold="True"></telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
</div>
</div>
这是 OnClick 事件的 aspx.cs:
protected void ExportExcel(object sender, EventArgs e)
{
//The following populates a grid
SqlDataSource sdsScores = new SqlDataSource();
sdsScores.ID = "sdsScores";
this.Page.Controls.Add(sdsScores);
sdsScores.DataSourceMode = SqlDataSourceMode.DataSet;
sdsScores.ConnectionString = constr;
sdsScores.SelectCommand = "SELECT Department, count(id) AS AuditCount, AVG(FinalScore) AS AverageScore, CASE WHEN AVG(FinalScore) > 87 THEN 'Outstanding' WHEN AVG(FinalScore) > 72 AND AVG(FinalScore) <= 87 THEN 'Exceeds Expectations' WHEN AVG(FinalScore) > 58 AND AVG(FinalScore) <= 72 THEN 'Meets Expectations' WHEN AVG(FinalScore) >= 44 AND AVG(FinalScore) <= 58 THEN 'Needs Improvement' ELSE 'Below Expectations' END AS ScoreCategory FROM PhaudDeptsConf WHERE AuditDate Between @ScoresBeginDt and @ScoresEndDt GROUP BY Department";
sdsScores.SelectParameters.Clear();
sdsScores.SelectParameters.Add("ScoresBeginDt", rdtpBeginDate.DbSelectedDate.ToString());
sdsScores.SelectParameters.Add("ScoresEndDt", rdtpEndDate.DbSelectedDate.ToString());
rgScores.DataSource = sdsScores;
rgScores.DataBind();
lblScores.Text = "Interdepartmental Comparison";
//The following creates and downloads an Excel file
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM PhaudDeptsConf WHERE Department = @Dept AND AuditDate BETWEEN @BeginDt AND @EndDt"))
{
//cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Dept", deptString);
cmd.Parameters.AddWithValue("@BeginDt", rdtpBeginDate.DbSelectedDate);
cmd.Parameters.AddWithValue("@EndDt", rdtpEndDate.DbSelectedDate);
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt, "Phauds");
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=SqlExport.xlsx");
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();
}
}
}
}
}
}
}
我在网格中使用 Telerik,但是当我使用 GridView 时也遇到了同样的问题。
【问题讨论】:
-
我认为问题在于您正在使用 MemoryStream - 响应代码将文件流式传输回浏览器;即使您在此之前已将网格绑定到某些数据,浏览器也不会呈现此内容。我猜上面的代码什么时候运行文件下载,并且页面保持完全一样?
-
@sh1rts - 你是对的。
-
这应该告诉你所有你需要知道的。当您在响应中缓冲文件内容后调用
Response.End();时,您将结束页面之后执行任何其他操作的能力(至少在呈现方面)。
标签: c# asp.net webforms telerik