代码之家  ›  专栏  ›  技术社区  ›  David

从Winforms迁移到ASP时的网格视图排序挑战。NET 2.0 Web表单

  •  1
  • David  · 技术社区  · 17 年前

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

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

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

    现在,该代码正被移动到一个新的web应用程序(ASP.NET 2.0,VB代码隐藏页面)。

    我曾尝试过只让收藏的某些列显示在网格视图中,网格视图看起来相当不错。当我打开“允许排序”时,问题就出现了。

    我犯了一个错误,没有一个。排序方法等。在研究过程中,我发现了各种易于使用数据视图实现的解决方案 如果 我的来源是一个数据表。但它不是——它是一个收藏品。我试图通过将集合转换为XML内存流来“廉价拍摄”数据源,他们也试图这样做。ReadXML返回到数据集中,但不起作用[根元素丢失错误是我在数据集中得到的。ReadXML(ioTemp),其中ioTemp是xml序列化程序中使用的System.IO.MemoryStream]。

    由于使用了旧的桌面应用程序,我从来不用担心对集合进行排序,因为加载后gridview会处理它。事实上,这是该系列的“标准”。排序属性。排序方向和。通过NotSupportedExceptions应用排序(我从很久以前的程序员那里继承了这段代码)。

    是否有一种简单的方法可以将集合转换为数据表,或者一种无需每次都返回数据库即可对集合进行排序的方法?由于对象构建过程中存在复杂的规则,对象数据源无法工作——VS2005中的向导无法处理我们需要做的事情(有条件地从多个表中抓取数据以创建对象)。

    提前感谢。

    5 回复  |  直到 17 年前
        1
  •  2
  •   Sean Taylor    17 年前

    你有没有考虑过客户端排序?

    我过去曾在ASP网格视图中使用过jquery表排序器插件。

    http://tablesorter.com/

        2
  •  0
  •   SecretDeveloper    17 年前

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

    Google results

    你没有提到错误消息,所以我不能确定是否是这样,你能发布错误吗?

    编辑:

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

    Have a look at this

        3
  •  0
  •   rp.    17 年前

    鉴于您显然是在用自己的对象集合填充网格,这听起来像是Linq for objects的完美工作。只需稍加努力,您就可以对您的集合实现有效的SQL Select语句。很酷的东西。

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

    此外,您真的只想对网格中的数据进行排序吗?如果是这样,那么肯定会用Linq来对付你的物体。然而,对网格内容进行排序很少能真正解决问题(“对网格进行排序”通常意味着更改用于填充网格的数据的访问路径。)浏览器应用程序与Windows应用程序不同,也没有与底层数据源的全时连接,无法像Windows中的DataGridView那样神奇地发生事情。

        4
  •  0
  •   SBurris    16 年前

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

    当事件被触发时,找出哪个标头被点击了(每个标头一个方法或一个commandArgument值)。一旦知道了,做一个.orderBy或。对对象集合进行OrderByDescending,并将结果作为网格视图的数据源和数据绑定放回。

        5
  •  0
  •   David    16 年前

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

    因此,现在一个“Collection类”只不过是一个“Inherits List(Of 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用于触发事件的方法完美配合。

    推荐文章