SqlDataSource_OnSelected:获取数据(DataTable)而不重新执行查询

时间:2015-03-17 12:13:15

标签: c# asp.net gridview sqldatasource

我有一个SqlDataSource绑定到一个带有SQL的GridView,大约需要10秒来检索数据。

还有一个名为" PageSizeControl"的UserControl。它挂钩了GridView的SqlDataSource的选定事件。在这种情况下,我需要DataTable来准备PageSizeControl的一些设置。

目前,我正在使用以下代码执行此操作:

protected void ds_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
    SqlDataSourceView dsv = (sender as SqlDataSourceView);
    dsv.Selected -= ds_Selected;
    DataTable dt = (dsv.Select(DataSourceSelectArguments.Empty) as DataView).Table;
    int iRowCount = dt.Rows.Count;

    // some gui-adaption like visibility, text, ...
 }

在旧版本中,我们使用了e.AffectedRows。但是,当将Filter应用于DataSource时,存储在e.AffectedRows中的值不正确。我们有一些用例,我们不需要行计数而只需要整个DataTable。

问题是,.Select()重新执行Db-Query,这需要另外10秒才能完成。

我还尝试在SqlDataSource上打开缓存:

EnableCaching="true" CacheDuration="Infinite"

但这有两个原因: 1.访问缓存数据时不会触发OnSelected事件 2.如果OnSelected事件被触发(因为数据尚未被缓存),.Select()仍然执行未缓存并需要10秒。

有没有人有线索如何在没有时间消耗的情况下重新执行查询来获取数据?最好的是OnSelected,但我可以提出另一个建议。

1 个答案:

答案 0 :(得分:1)

我有一个符合我要求的变通方法。我使用事件GridView.OnRowDataBound并获取第一个GridRow的DataItem,它包含DataTable。

private DataTable oData = null;
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (oData == null && e.Row.DataItem != null)
    {
        oData = (e.Row.DataItem as DataRowView).Row.Table;
    }
}

这个解决方案有效,但它看起来很脏,需要一个GridView(在我的情况下没问题)。我会很感激一个更清洁的解决方案。

<强>更新 经过IlSpy的长时间研究后,我得出的结论是,无法在OnSelected事件中获取数据。即使没有启用缓存也不行,因为缓存是在OnSelected之后写的。

所以最简单的方法是打开缓存并调用需要数据的SqlDataSource.Select(...)函数。

另一种方法是使用SqlDataSource.Select(...)自行获取数据,然后将表绑定到控件。但这有一些缺点。例如:绑定到数据集/数据表时,GridView上的排序和分页无法正常工作。

另一种方法是从选择它的控件中提取数据。请参阅上面的GridView示例。