1

我对 Gridview 排序有一个问题,它与其他排序类似,但我绑定到集合对象而不是数据表。

应用程序的现有业务规则和数据访问层遵循拥有一个对象的模式,如果您需要该类型的对象的集合,则拥有另一个继承 CollectionBase 并实现 IBindingList 的类。

对于桌面应用程序,很容易将 gridview 数据绑定到这些对象之一,并且打开列排序没有任何问题。桌面应用程序的表示层中的一切都处于“状态”。

现在该代码正被移至新的 Web 应用程序(ASP.NET 2.0、VB 代码隐藏页面)。

我已经玩弄了我必须做的事情,只让集合的某些列显示在 gridview 中,并且 gridview 看起来相当不错。当我打开“允许排序”时,问题就出现了。

我收到了关于没有 .Sorting 方法等的错误。在研究这个时,如果我的源是数据表,我发现各种解决方案都可以通过数据视图轻松实现。但它不是——它是一个集合。我试图通过将集合转换为 XML 内存流来“廉价拍摄”数据源,然后他们尝试将 .ReadXML 重新转换为数据集,但这没有用 [就我在数据集中得到的根元素丢失错误而言。 ReadXml(ioTemp) 其中 ioTemp 是 xml 序列化程序中使用的 System.IO.MemoryStream]。

由于旧的桌面应用程序,我从不用担心对集合进行排序,因为 gridview 会在加载后处理它。事实上,集合的 .SortProperty、.SortDirection 和 .ApplySort 都是通过 NotSupportedExceptions 实现的“标准”(我从早已不复存在的程序员那里继承了这段代码)。

有没有一种简单的方法可以将集合转换为数据表或对集合进行排序而不必每次都返回数据库?对象数据源无法工作,因为对象构建方式的复杂规则 - VS2005 中的向导无法处理我们需要做的事情(有条件地从多个表中获取数据以创建对象)。

提前致谢。

4

5 回答 5

2

您是否考虑过客户端排序?

我过去曾在 ASP Gridviews 中使用过 jquery tablesorter 插件。

http://tablesorter.com/

于 2009-02-05T19:55:54.313 回答
0

我有一个类似的问题,我需要在对象上实现 IComparable。基本上要对一组对象进行排序,您需要一种方法来区分它们的顺序。IComparable 接口有一个名为 Compare 的方法,它允许 .Net 框架在您对对象进行排序时计算出对象的顺序。您需要自己实现此方法才能使排序方法起作用。

谷歌搜索结果

您没有提及错误消息,所以我无法确定是否是这种情况,您可以发布错误吗?

编辑 :

关于您的评论;您可以实现多列排序,它只需要更多的工作。您可以指定对集合进行排序的字段,然后在 CompareTo 方法中使用此信息。

看看这个

于 2008-11-04T19:23:55.537 回答
0

鉴于您显然是在用自己的对象集合填充网格,这对于 Linq for Objects 来说是一项完美的工作。只需一点点麻烦,您就可以针对您的集合实现有效的 SQL Select 语句。很酷的东西。

http://www.hookdonlinq.com/LINQtoObjects5MinuteOverview.ashx

另外,您真的只想对网格中的数据进行排序吗?如果是这样,那么肯定会追求对您的对象使用 Linq。然而,对网格内容进行排序很少能真正解决问题(“对网格进行排序”通常转化为更改用于填充网格的数据的访问路径。)浏览器应用程序不像 Windows 应用程序并且没有与底层数据源的全时连接,使事情像 Windows 中的 DataGridView 使事情看起来一样神奇。

于 2008-11-04T23:21:44.620 回答
0

您可以将带有 On_Click 事件的链接按钮作为每列的标题。

触发事件时,确定单击了哪个标题(每个标题一个方法或一个 commandArgument 值)。一旦知道了,对对象集合执行 .orderBy 或 .OrderByDescending by,然后将结果放回作为 gridview 的数据源并对其进行数据绑定。

于 2010-01-02T18:20:41.497 回答
0

在我最初提出这个问题的那一年里,我设法实现了一个新的“标准”,以便业务对象的集合现在是通用列表。

所以现在一个“集合类”只不过是一个“继承列表(MyBusinessObject)”,它的排序方法看起来像这样(性能不是问题):

Public Overloads Sub Sort(ByVal strPropertyName As String, ByVal strDirection As String)
    Dim arSortedList As New ArrayList
    For Each item As MyBusinessObject In Me
        arSortedList.Add(item)
    Next
    arSortedList.Sort(New CaseInsensitiveComparer(Of MyBusinessObject)(strPropertyName, strDirection))
    For intI As Integer = 0 To arSortedList.Count - 1
        Item(intI) = arSortedList(intI)
    Next
End Sub

这似乎与 GridView 用于触发事件的方法完美配合。

于 2010-01-04T12:28:00.100 回答