DataGridView排序不起作用

时间:2010-11-09 19:30:25

标签: .net vb.net visual-studio-2010

Visual Studio 2010 VB.NET

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

任何帮助都会受到赞赏吗?

感谢名单

Bodger

根据请求,这里有一些代码片段。

此方法详细定义了我在中设计的列中的列 设计师。

列名称称为pSelected或pCustomer,对应于a 与列定义关联的同名属性。


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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果我没记错的话,你可以在你的集合和datagridview之间放置一个绑定源,绑定源将提供一堆功能。我认为它也允许你排序。由于我现在无法测试,所以这一切都是我的头脑。

答案 2 :(得分:0)

如果这纯粹是为了只读目的,并且您不需要用户能够进行动态排序,那么我建议您在设置数据源之前在代码中对集合进行排序。

示例:

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

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

这是一些工作,但我认为您实现自定义排序方案比使Microsoft组件按照您的意愿弯曲更有利。