2010-11-09 211 views
6

Visual Studio 2010 VB.NETDataGridView排序不起作用

我有一个DataGridView.DataSource设置为自定义对象的集合。这些列使用自定义对象的只读属性进行显示,此对话框仅用于显示。这些属性都返回String对象。我设置了所有列,但其中2列是自动分类模式(未设置的是按钮或复选框)。但它不排序。我搜索周围和大多数人使用sql或绑定源,但我使用一个简单的vb集合。有人说我应该实现IComparable,但不是字符串已经IComparable?

任何帮助将不胜感激?

感谢名单

Bodger

每一个请求,这里有一些代码段。

该方法根据我在 设计器中设计的列详细定义了列。

列名称称为pSelected或pCustomer,并且与列定义所绑定的名称相同,并与 属性对应。


Protected Sub UpdateDGVUS() 
     If Not USColumnsInitted Then 
      USColumnsInitted = True 

      dgvUS.AutoGenerateColumns = False 
      dgvUS.Columns.Clear() 

      Dim iIdx As Integer 

      iIdx = 0 

      dgvUS.Columns.Insert(iIdx, Me.pSelected) 
      dgvUS.Columns("pSelected").DisplayIndex = iIdx 
      dgvUS.Columns("pSelected").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCustomer) 
      dgvUS.Columns("pCustomer").DisplayIndex = iIdx 
      dgvUS.Columns("pCustomer").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDetails) 
      dgvUS.Columns("pDetails").DisplayIndex = iIdx 
      dgvUS.Columns("pDetails").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pSelectCustomerInvoice) 
      dgvUS.Columns("pSelectCustomerInvoice").DisplayIndex = iIdx 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDate) 
      dgvUS.Columns("pDate").DisplayIndex = iIdx 
      dgvUS.Columns("pDate").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pAmount) 
      dgvUS.Columns("pAmount").DisplayIndex = iIdx 
      dgvUS.Columns("pAmount").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight 
      dgvUS.Columns("pAmount").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pName) 
      dgvUS.Columns("pName").DisplayIndex = iIdx 
      dgvUS.Columns("pName").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pPayment) 
      dgvUS.Columns("pPayment").DisplayIndex = iIdx 
      dgvUS.Columns("pPayment").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCompany) 
      dgvUS.Columns("pCompany").DisplayIndex = iIdx 
      dgvUS.Columns("pCompany").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pType) 
      dgvUS.Columns("pType").DisplayIndex = iIdx 
      dgvUS.Columns("pType").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDescription) 
      dgvUS.Columns("pDescription").DisplayIndex = iIdx 
      dgvUS.Columns("pDescription").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dataUpdatedUS() 
     End If 
    End Sub 

这是是集


Public Class ItemXact01 
    Public Property FirstName As String 
    Public Property LastName As String 
    Public Property Company As String 
    Public Property Type As String 
    Public Property Description As String 
    Public Property RefNumber As String 
    Public Property DownloadID As String 
    Public Property Selected As Boolean 
    Public Property RequestID As Integer 

    ... 

    Public ReadOnly Property pCompany As String 
     Get 
      pCompany = Company 
     End Get 
    End Property 

    Public ReadOnly Property pType As String 
     Get 
      pType = Type 
     End Get 
    End Property 

    Public ReadOnly Property pDescription As String 
     Get 
      pDescription = Description 
     End Get 
    End Property 

    Public ReadOnly Property pSelected As Boolean 
     Get 
      pSelected = Selected 
     End Get 
    End Property 

在自定义对象的片段......

的数据被放入地方使用此代码


    Private Sub dataUpdateDGV(ByRef dgv As DataGridView, ByRef myCollection As Collection) 
     myMain.Log("dataUpdatedDGV: 001 :" & dgv.RowCount & ":" & myCollection.Count & ":") 

' for some reason the not equal to does not show in the next line 

     If dgv.RowCount myCollection.Count Then 
      myMain.Log("dataUpdatedDGV: 002") 

      dgv.DataSource = Nothing 
      If myCollection.Count > 0 Then 
       myMain.Log("dataUpdatedDGV: 003") 

       dgv.DataSource = myCollection 
      End If 
     End If 

     myMain.Log("dataUpdatedDGV: 004") 

     dgv.Invalidate() 
     dgv.Update() 
     dgv.Refresh() 

     myMain.Log("dataUpdatedDGV: OUT") 
    End Sub 
+0

你可以发布你用来定义'DataGridView'的代码。 – ChrisF 2010-11-09 19:37:52

+0

我使用对话框的设计器。它有一个tab控制器,其中一些标签包含datagridviews。在这里,我可以把一些片段,我想: – Bodger 2010-11-09 20:38:19

回答

1

如果我没有记错,你可以在你的集合和datagridview之间放置一个绑定源,绑定源将提供一堆功能。我认为它可以让你排序。这一切都只是我的头顶,因为我现在无法测试它。

+1

我在以太网中找到了一个SortableBindingList类,它可以工作。 – Bodger 2010-12-13 19:06:45

0

如果这纯粹是为了只读的目的,并且你不需要用户能够进行动态分类,那么我建议你这样做在设置数据源之前,先将代码中的集合添加到代码中。

例子:

myDataGridView.DataSource = null; 
myCollection.Sort(); 
myDataGridView.DataSource = myCollection; 

,可以让你默认的排序。 如果你需要实现动态排序, 我建议你重用你的myCollection.Sort()方法,比如用一个按钮排列每一列来创建一个停靠在datagridview之上的新面板。将这些按钮中的click事件链接到.Sort()方法,并向该方法添加一个参数,以了解按哪个列进行排序。

这是一点点工作,但我认为实现自定义排序方案比让您的Microsoft组件屈服于自己的意愿要多得多。

+0

谢谢你的回应,但我不需要它自定义排序,我只是希望它按选定的列排序。当我点击列标题时没有任何反应。 – Bodger 2010-11-09 20:27:49

4

这里关键的是DataGridView不负责排序; 底层数据源(即DataSource的.DataSource)是。

你可以实现像这样SortableBindingList(用于Windows。Forms) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

+0

你说得对,但必须说这是一个灾难性的设计。网格如何排序显然是一个演示文稿,应该由控件处理。坦白说,只要列中的绑定值是相同类型(通常是这种情况)并实现IComparable(就像所有基本数据类型一样),就很难明白为什么它很难做到。这种winforms方法的一个副作用是你不能绑定一个列表到多个视图,因为* datasource *跟踪顺序和选定的项目等等。用大量金额和与每个货币相关的货币的下拉列表来查看视图。 – 2013-02-15 15:07:15

+0

应用于特定网格的排序在DataGridView中。实际排序的**方法**在DataSource中。 – 2013-07-29 00:26:12