【问题标题】:Unable to populate grid onclick event in Asp.net Web Forms Application无法在 Asp.net Web 窗体应用程序中填充网格 onclick 事件
【发布时间】: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


【解决方案1】:

您还需要一个数据适配器和一个用于 GridView 的数据集。

尝试:

sdsScores.Open();
SqlDataAdaptor dataAdaptor = new SqlDataAdaptor(query,connectionString);

DataSet myData = new DataSet();
sdsScores.Fill(myData, [tablename]);

GridView.DataSource = myData;
GridView.DataBind();

【讨论】:

    【解决方案2】:

    不要使用rgScores.DataBind();,因为telerik radgrid 自动绑定onNeed_DataSource 方法中的数据。问题可能是因为这个。

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多