Сортировка 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 сгибаться по вашей воле.