Сортировка DataGridView не работает

Visual Studio 2010 VB.NET

У меня есть DataGridView.DataSource набор в коллекцию пользовательских объектов. Столбцы используют свойства только для чтения из настраиваемого объекта для отображения, это диалоговое окно предназначено только для отображения. Свойства все возвращают строковые объекты. Я установил все столбцы, кроме 2 из них, в sortmode automatic (те, которые не установлены, - это кнопка или флажок). Но он не сортируется. У меня есть googled вокруг, и большинство людей используют sql или источники привязки, но я использую нетривиальная коллекция глаг. Некоторые говорят, что я должен реализовать IComparable, но разве строка уже 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, и источник привязки предоставит кучу функций. Я думаю, что это позволяет вам сортировать. Это все просто с моей головы, так как я не могу проверить это прямо сейчас.


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

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


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

пример:

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

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

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