2011-02-07 17 views
9

Ho bisogno di ordinare un DataTable o DataGridView da una colonna che è un valore stringa, ma con valori null/vuoti in BOTTOM quando si ordina ASCENDING.Ordinamento colonna stringa DataTable, ma con null/vuoto in fondo

Il DataTable NON è popolato da un'istruzione SQL, quindi nessun ordine di.

Se faccio

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

allora viene generata un'eccezione, dicendo che il DataGridView è DataBound, che è corretto, ma non mi aiuta, e voglio tenerlo databound.

È .NET 2.0, il che significa che non è disponibile LINQ!

risposta

8

in alcuni casi si potrebbe fare questo se si dispone di un'altra colonna in più nella tabella:

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



Edit:
come non in 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

non funziona –

+1

@Waqas Raja: È sporco, ma funziona! Divertente, in qualche modo mi sembra sempre mancare le soluzioni più semplici. –

+0

Cool, allora puoi impostare la mia risposta come risposta ;-) –

0

anche se il DataTable si associa a DataGridView controllo dell'interfaccia utente non è popolata tramite SQL, è ancora possibile ordinare utilizzando un DataView, si può fare qualcosa di simile:

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

allora fate il vostro legame .

come funziona? I valori nulli sono in alto o in basso?

+0

sì ma non inserirà valori Null/vuoti in basso. –

+0

@Waqas Raja: Esattamente! Questo è il mio problema ... –

+0

Certo, è esattamente quello che ho fatto, solo che non ti rendi conto che il punto della domanda è quello di ottenere null/vuoto in basso, che è esattamente ciò che non accade in quel modo. –

7

Davide Piras ha una buona soluzione, tuttavia c'è un'altra soluzione più semplice che ho

Aggiungi una nuova colonna e fallo in una sola riga

// 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(); 
Problemi correlati