2010-11-09 9 views
6

Visual Studio 2010 VB.NETDataGridView Сортировка не работает

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

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

Thanx

Bodger

Per запрос здесь некоторые фрагменты кода.

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

Имена столбцов называются 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 
+0

Можете ли вы разместить код, используемый для определения 'DataGridView'. – ChrisF

+0

Я использую конструктор для диалога. Он имеет контроллер табуляции с некоторыми вкладками, содержащими datagridviews. Здесь я могу поместить некоторые фрагменты, которые я предполагаю: – Bodger

ответ

1

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

+1

Я нашел класс SortableBindingList в эфире, и он работает. – Bodger

0

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

Пример:

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

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

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

+0

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

4

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

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

+0

Вы правы, но, надо сказать, это катастрофический дизайн. Как сортировка сетки, очевидно, является предметом презентации, и ее следует контролировать с помощью элемента управления. И, откровенно говоря, трудно понять, почему это трудно сделать, если связанные значения в столбце одного типа (как правило, это случай) и реализуют IComparable (как это делают все базовые типы данных). Одним из побочных эффектов этого подхода winforms является то, что вы не можете привязать список к нескольким представлениям, потому что * datasource * отслеживает порядок и выбранный элемент и так далее. Покажите представление с большим количеством сумм и выпадающим списком валют, связанных с каждым. –

+0

Сортировка, применяемая к конкретной сетке, находится в DataGridView. ** метод ** для фактической сортировки находится в DataSource. –

Смежные вопросы