【问题标题】:filtering on gridview control VS-2008在gridview控件上过滤VS-2008
【发布时间】:2010-12-15 11:39:12
【问题描述】:

这就是我正在努力回到网络开发世界的原因

带有 VS2008 的 ASP.Net

Subsonic 作为数据访问层

SqlServer 数据库

首页项目说明: 我有一个学生注册系统。我有一个应该显示学生记录的网页。

目前我有一个显示记录的 gridview 控件

用户登录并进入查看学生页面。 gridview显示系统中的学生,其中一列是open,pending,complete的注册状态。

我希望用户能够对返回的结果应用动态排序或过滤器,以便获得他们希望看到的更精细的结果。我设想允许用户通过亚音速方法通过数据集接口对返回的结果应用 where 子句或 like 子句来过滤结果。我不想再次查询数据库以应用过滤器

示例:初始查询

Select * from studentrecords where date = convert(varchar(32,getdate(),101)

然后用户应该能够对返回的结果集应用过滤器,以便他们可以使用姓氏,例如“%Souza%”

这是否可能,并且将数据源绑定到 gridview 控件是最好的方法,还是我应该创建一个从 collectionbase 继承的自定义集合,然后将其绑定到 gridview 控件?

PS:对不起,错字。我的机器受到笔记本电脑上茶水的影响

【问题讨论】:

  • 您是想只搜索一个字段(姓氏)还是让用户选择他要搜索和排序的字段?在不进入数据库的情况下获取所有记录和排序总是一种不好的方法。因为如果你这样做,将看不到最后的更新。

标签: c# asp.net


【解决方案1】:

我使用 LINQ-to-SQL,而不是 Subsonic,所以使用 YMMV,但我的过滤方法是为数据源提供 OnSelecting 处理程序。在 LINQ-to-SQL 中,我可以将结果替换为对 DataContext 方法的引用,该方法返回应用表值函数的结果。您可能想用 Subsonic 调查类似的事情。

【讨论】:

    【解决方案2】:

    正如 tvanfosson 所说,LINQ 非常适合进行可组合查询;您可以使用基础库生成的完全标准的 TSQL 或通过在数据上下文中使用 [FunctionAttribute(..., IsComposable=true)] 标记的 UDF 来执行此操作。

    我对 Subsonic 不熟悉,因此无法提供建议;但另一个想法:在您的“date =”代码中,您可能会考虑声明一个日期时间变量并首先分配它......这样优化器通常可以更好地优化它(查询更简单,并且没有质疑它是将日期时间(每行)转换为 varchar,还是将 varchar 转换为日期时间)。获取日期部分的最有效方法是 cast/floor/cast:

    SET @today = GETDATE()
    SET @today = CAST(FLOOR(CAST(@today as float)) as datetime)
    

    [更新重新评论]

    可组合 - 我的意思是,这允许您构建一个查询,以便只有 final 查询在数据库中执行。例如:

    var query = from row in ctx.SomeComplexUdf(someArg)
                where row.IsOpen && row.Value > 0
                select row;
    

    可能会通过 TSQL 关闭服务器:

    SELECT u1.*
    FROM dbo.SomeComplexUdf(@p1) u1
    WHERE u1.IsOpen = 1 -- might end up parameterized
    AND u1.Value > 0 -- might end up parameterized
    

    这里的重点是服务器只返回合适的数据,而不是返回大量数据,然后丢弃。 LINQ-to-SQL 可以通过可组合查询执行各种操作,包括分页、排序等。通过最大限度地减少从数据库加载的数据量,您可以显着提高性能。

    没有可组合性的替代方案是它只是这样做:

    SELECT u1.*
    FROM dbo.SomeComplexUdf(@p1) u1
    

    然后丢弃您的网络应用程序中的其他行...显然,如果您期望 20 条打开记录和 10000 条关闭记录,这是一个巨大的差异。

    【讨论】:

    • MG:当您说可组合查询时,这是否需要重新查询数据库,还是对初始查询期间返回的结果起作用?
    【解决方案3】:

    这样的事情怎么样?

    与其将数据源/表分配给您的网格控件,不如将“DataView”附加到它。

    这是一个伪代码示例:

    DataTable myDataTable = GetDataTableFromSomewhere();    
    DataGridView dgv = new DataGridView();
    DataView dv = new DataView(myDataTable);
    
    //Then you can specify things like:
    dv.Sort = "StudentStatus DESC";
    dv.Filter = "StudentName LIKE '" + searchName + '";
    dgv.DataSource = dv;
    

    ...等等。

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多