DataGridView Sort не работает

Visual Studio 2010 VB.NET

У меня есть DataGridView.DataSource для коллекции пользовательских объектов. Столбцы используют только для чтения свойства из пользовательского объекта для отображения, этот диалог только для отображения. Все свойства возвращают объекты String. Я установил все столбцы, кроме 2, в автоматический режим сортировки (те, которые не установлены, являются кнопкой или флажком). Все же это не сортирует. Я гуглил, и большинство людей используют sql или источники привязки, но я использую тривиальную коллекцию vb. Некоторые говорят, что я должен реализовать IComparable, но разве String уже не IComparable?

Любая помощь будет оценена?

Thanx

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

3 ответа

Решение

Если я правильно помню, вы можете поместить источник привязки между вашей коллекцией и сетью данных, а источник привязки обеспечит множество функциональных возможностей. Я думаю, что это позволяет вам также сортировать. Это все только от моей головы, поскольку я не могу проверить это прямо сейчас.

Ключевым моментом здесь является то, что DataGridView не отвечает за сортировку; базовый источник данных (т.е. .DataSource источника данных).

вы могли бы реализовать что-то вроде этого SortableBindingList (для Windows.Forms) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

Если это сделано только для чтения и вам не нужно, чтобы пользователь мог выполнять динамическую сортировку, то я бы порекомендовал вам отсортировать коллекцию в вашем коде до установки источника данных.

Пример:

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

Это может дать вам сортировку по умолчанию. Если вам затем потребуется реализовать динамическую сортировку, я бы порекомендовал вам повторно использовать метод myCollection.Sort(), например, сделать новую панель закрепленной над сеткой просмотра с кнопками для сортировки каждого столбца. Свяжите событие click в этих кнопках с вашим методом.Sort () и добавьте параметр в метод, чтобы узнать, по какому столбцу сортировать.

Это немного трудоемко, но я думаю, что вам больше повезет с реализацией пользовательского сценария сортировки, чем с тем, чтобы ваши компоненты Microsoft подчинялись вашей воле.

Другие вопросы по тегам