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 подчинялись вашей воле.