DataGridView Сортировка не работает - PullRequest
6 голосов
/ 09 ноября 2010

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 ]

4 голосов
/ 10 ноября 2010

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

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

1 голос
/ 10 ноября 2010

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

0 голосов
/ 09 ноября 2010

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

Пример:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...