2010-11-09 52 views
6

Visual Studio 2010 VB.NETDataGridView Ordenar no funciona

Tengo un DataGridView.DataSource establecido en una colección de objetos personalizados. Las columnas usan propiedades de solo lectura del objeto personalizado para mostrar, este diálogo es sólo para visualización. Todas las propiedades devuelven objetos String. Configuré todas las columnas menos 2 de ellas para sortmode automático (las que no están configuradas son un botón o una casilla de verificación). Sin embargo, no ordena. He buscado en Google y la mayoría de la gente usa SQL o fuentes vinculantes, pero estoy usando una colección vb trivial. Algunos dicen que debo implementar IComparable, pero ¿no es ya posible Strom?

¿Alguna ayuda sería apreciada?

Gracias

Bodger

por una solicitud Éstos son algunos fragmentos de código.

Este método define las columnas en detalle a partir de las columnas que diseñé en el diseñador .

Los nombres de las columnas se llaman pSelected o pCustomer y se corresponden con una propiedad con el mismo nombre con el que se relaciona la definición de la columna.


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 

Este es un fragmento del objeto personalizado que está en la colección


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 

...

Los datos se puso en marcha con este código


    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

Puede publicar el código que utiliza para definir el 'DataGridView'. – ChrisF

+0

Uso el diseñador para el diálogo. Tiene un controlador de pestañas con algunas pestañas que contienen datagridviews. Aquí puedo poner algunos fragmentos, supongo: – Bodger

Respuesta

1

Si mal no recuerdo, puede poner una fuente de enlace entre su colección y el datagridview y la fuente de enlace proporcionará una gran cantidad de funcionalidades. Creo que te permite ordenar también. Todo esto está fuera de mi cabeza ya que no puedo probarlo ahora mismo.

+1

Encontré una clase SortableBindingList en el éter y funciona. – Bodger

0

Si esto es solo para fines de solo lectura, y no necesita que el usuario pueda hacer una clasificación dinámica, entonces lo recomendaría rt la colección en su código antes de establecer la fuente de datos.

Ejemplo:

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

que podría conseguir que por defecto de clasificación. Si luego necesita implementar la ordenación dinámica, , le recomendaría reutilizar su método myCollection.Sort(), como hacer un nuevo panel acoplado sobre la vista de cuadro de datos con botones para ordenar cada columna. Vincule el evento click en esos botones con su método .Sort() y agregue un parámetro al método para saber por qué columna ordenar.

Es un poco de trabajo, pero creo que tendrá más suerte implementando un escenario de clasificación personalizado que hacer que sus componentes de Microsoft se doblen a su voluntad.

+0

Gracias por su respuesta, pero no lo necesito personalizado, solo lo quiero ordenado por la columna seleccionada. No ocurre nada cuando hago clic en el encabezado de la columna. – Bodger

4

La clave aquí es que DataGridView no es responsable de la clasificación; es la fuente de datos subyacente (es decir, .DataSource de DataSource).

podría implementar algo como esto SortableBindingList (para Windows.Formularios) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

+0

Tiene razón, pero debe decirse que es un diseño desastroso. Cómo se ordena una grilla es claramente una cuestión de presentación y debe ser manejada por el control. Y francamente es difícil ver por qué sería difícil hacerlo, siempre y cuando los valores encuadernados en una columna sean del mismo tipo (generalmente el caso) e implementen IComparable (como lo hacen todos los tipos de datos básicos). Un efecto secundario de este enfoque de winforms es que no se puede vincular una lista a múltiples vistas, porque el * datasource * rastrea el orden y el elemento seleccionado, y así sucesivamente. Imagine una vista con muchos montos y una lista desplegable de monedas asociadas a cada uno. –

+0

La ordenación aplicada a una grilla particular se encuentra en DataGridView. El ** método ** para la clasificación real está en el DataSource. –

Cuestiones relacionadas