2011-02-07 14 views
9

Necesito ordenar una DataTable o DataGridView por una columna que sea un valor de cadena, pero con valores nulos/vacíos en el FONDO al ordenar ASCENDING.Ordenando la columna de cadena DataTable, pero con nulo/vacío en la parte inferior

El DataTable NO está poblado por una instrucción de SQL, por lo que no hay orden por.

Si hago

DataGridView1.Sort(New RowComparer(System.ComponentModel.ListSortDirection.Ascending)) 

entonces se produce una excepción, diciendo que el DataGridView es DataBound, lo cual es correcto, pero no me ayuda, y yo quiero mantenerlo enlace de datos.

¡Es .NET 2.0, lo que significa que no hay LINQ disponible!

Respuesta

8

en algunos casos se podría hacer esto si tiene otra columna adicional en la tabla:

SELECT completed, completed IS NULL AS isnull 
FROM TABLE 
ORDER BY isnull DESC, completed DESC 



Editar:
gusta esta en VB.NET

 For Each srSearchResult In srcSearchResultCollection 

      Try 
       dr = dt.NewRow() 
       dr("cn") = srSearchResult.GetDirectoryEntry().Properties("cn").Value 
       dr("Account") = srSearchResult.GetDirectoryEntry().Properties("sAMAccountName").Value 
       dr("Nachname") = srSearchResult.GetDirectoryEntry().Properties("sn").Value 
       dr("Vorname") = srSearchResult.GetDirectoryEntry().Properties("givenname").Value 
       dr("Mail") = srSearchResult.GetDirectoryEntry().Properties("mail").Value 
       dr("HomeDirectory") = srSearchResult.GetDirectoryEntry().Properties("homedirectory").Value 
       dr("LogonScript") = srSearchResult.GetDirectoryEntry().Properties("scriptPath").Value 

       dr("IsNull") = String.IsNullOrEmpty(dr("Nachname").ToString()) 

       dt.Rows.Add(dr) 
      Catch ex As Exception 

      End Try 

     Next srSearchResult 
dt.DefaultView.Sort = "IsNull ASC, Nachname ASC" 
+0

no funciona –

+1

@Waqas Raja: ¡Está sucio, pero funciona! Es curioso, de alguna manera, siempre me pierdo las soluciones más simples. –

+0

Genial, entonces puedes establecer mi respuesta como respuesta ;-) –

0

incluso si el DataTable se asocie a la DataGridView control de la interfaz de usuario no se rellena a través de SQL, todavía se puede solucionar utilizando un DataView, se puede hacer algo como esto:

DataView myView = myDataTable.DefaultView; 
myView,Sort = "yourColumnName ASC"; 

entonces usted hace su unión .

cómo funciona? ¿Los valores nulos están arriba o abajo?

+0

Sí, pero no colocará Valores nulos/vacíos en la parte inferior. –

+0

@Waqas Raja: ¡Exactamente! Ese es mi problema ... –

+0

Claro, eso es exactamente lo que hice, solo que no se dio cuenta de que el objetivo de la pregunta es obtener nulo/vacío en la parte inferior, que es exactamente lo que no sucede de esa manera. –

7

Davide Piras tiene una buena solución, sin embargo hay otra solución más simple que tengo

Agregue una nueva columna y hágalo en una sola línea

// just, add a new column 
ActualDataTable.Columns.Add("NullEmptyCheck", typeof(int), "ColumnNameToSort is Null OR ColumnNameToSort = ''"); 

// apply sort expression 
ActualDataTable.DefaultView.Sort = "NullEmptyCheck asc, ColumnNameToSort asc"; 
// pass datasource to grid 
MyGridView.DataSource = ActualDataTable.DefaultView; 
MyGridView.DataBind(); 
Cuestiones relacionadas