ASP.NET网格具有自动分页,可排序,可搜索... GridView?列表显示?

时间:2011-09-28 00:09:12

标签: c# .net asp.net gridview

我需要构建一个<table>来显示产品。我对GridView或ListView不太熟悉,不确定他们是否可以在下面执行这些操作。

要求:

  • 自动分页。一次只能获取100条记录(首次加载时不是整个1000000条记录)
  • 排序。我需要能够指定默认排序顺序,但用户也可以单击标题
  • 检索。用户需要能够过滤他们想要查看的数据。
  • 我(程序员)需要能够轻松关闭/打开列(理想情况下我只需要注释掉一行来隐藏列)
  • 数据将来自SQL Server,多个表

有没有人知道任何可以执行上述操作的ASP.NET控件?提前谢谢!

3 个答案:

答案 0 :(得分:2)

GridViewListView如果在其中放置DataPager,则可以进行分页。 ListView是一个模板控件 - 显示是完全自定义的,因此您必须滚动自己的“列”;对GridView没什么用处,所以我不知道那个。

至于搜索和排序,如果你需要一个数据源ASP.NET无法直接查询,那么它就会有一些内置的支持变得无用 - ObjectDataSource允许你创建自己的数据访问代码,但你还必须实现一些无法自动完成的事情。

对于搜索,您可以处理ODS的Selecting事件,您可以将任意参数传递给查询方法;我相信还有一些方法可以自动获取控制值/查询字符串参数等。

对于排序,ListView可让您将Button添加到CommandName="Sort"CommandArgument="[column to sort by]"的位置。使用非自定义数据源时,我相信它们会正常工作。使用ObjectDataSource时,他们所做的只是让ListView跟踪“排序表达式”,您可以将其传递到ODS.Selecting事件中的数据源。排序表达式的格式是指定的...在我需要的时候我永远找不到的地方。使用单列排序时,对于升序排序,这将是"[column name]",对于降序排序,则为"[column name] DESC"。您可以直接将其传递给ObjectQuery.OrderBy; EntityFramework.Extended还为新的API表面提供了扩展方法。 ListView(我相信)只处理单列排序,对于多列排序,您必须自己管理排序表达式。

所有这些内容的文档是分散的,一个很好的起点是this tutorial,它的后续内容以及您可以在左侧边栏中找到ListView的链接。

我的项目也合理地简单地使用了ListViewObjectDataSource - 意思是,它的任何部分都不依赖于神奇的RAD功能,如下所示。我从实际项目中提取它,因此可能会有轻微的不一致。

ListView + ObjectDataSource示例

以下示例从WCF服务(未包含)中检索“消息”(在公司门户网站上查看新闻公告)。

MessagesDataSource.cs

调用WCF服务的ObjectDataSource委托。数据源负责:

  • 过滤基于usernametype参数
  • 排序基于sort参数
  • 中的排序表达式skiptake参数指定的
  • 分页 - 命名为与the LINQ operators
  • 一致

因为我们正在使用ObjectDataSource,所有这些都已在委托中实现 - 这是最终调用服务的地方。

public enum MessageType
{
    None = 0,
    All,
    General,
    OfficeHoursUpdate,
    // …
}

[DataObject]
public class MessagesDataSource : IDisposable
{
    IMessagesService _svc = new MessagesServiceClient();

    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<Message> Select(string username, MessageType type, string sort, int skip, int take)
    {
        return _svc.GetMessages(username, type, sort, skip, take);

    }

    public int SelectCount(string username, MessageType type, string sort, int skip, int take)
    {
        return _svc.CountMessages(username, type);
    }
}

Messages.ascx

将消息列表呈现为一个表,每条消息有一个<tbody>,其中一行拆分为消息“headers”的列,第二行包含为消息正文合并的所有列。注意事项:

  • 如果在下拉列表中选择了某个值,则会从第一页开始刷新ListView
  • MessageDataSource.Select().SelectCount()方法采用的所有参数都应在ODS的<SelectParameters>中声明。 (如果Visual Studio不匹配,Visual Studio将显示错误。)
  • ObjectDataSource控件的TypeName属性指示由ODS实例化的ODS委托。要更好地控制此操作,请处理ODS的ObjectCreating / ObjectCreated事件。 (例如,您可以将包含控件传递给ODS代理。)
  • StartRowIndexParameterNameMaximumRowsParameterName属性命名的参数值将由数据分页器自动提供。
  • 我不相信使用SortParameterNameListView填充ObjectDataSource参数的值 - 使用{{1}时可能会或可能不会}。我也不认为在这种情况下这是必要的,但是再次保持在那里不会伤害任何人。
  • 我省略了数据分页器字段,它们只是杂乱无章。
  • 标题中排序GridView的{​​{1}}值不必匹配数据对象的属性,实际上可以完全任意。
CommandArgument

Messages.ascx.cs

这个课程相当简单,主要涉及初始化页面和排序指标等切线问题。大多数“有趣”的位都添加了注释。

LinkButton

免责声明:我并不声称自己是该主题的权威,事实上我对.NET也是新手。这恰好是我最近必须处理的事情,并且也被分散的文档所困惑,这些文档倾向于采用一部分问题的快捷方式(即使用GridView自动获取完整视图,或使用ADO.NET数据源而不是自定义数据访问代码);或者在绒毛上花费太多空间(例如,在Visual Studio向导中单击按钮的截图。)

答案 1 :(得分:1)

这不是免费的,但Telerik的RadGrid功能非常全面,可以100%满足您的需求,否则它会让您非常接近。

Telerik RadGrid:http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx

答案 2 :(得分:0)

如果您的数据仅在未编辑或更新时显示,则可以使用Data Repeater控件。它是一个非常轻量级的控件,但是你可能已经编写了所有的分页和排序逻辑。它在某种程度上是好的,这样你就可以对代码进行细致的控制..

点击此链接了解详情。ASP.net Repeater Control