2013-10-21 10 views
5

Come si ordina un datatable? Devo restituire un datatable da una funzione. Ho lottato con questo per ore, e Internet ha alcune risposte diverse, nessuna delle quali sembra funzionare per me.Come ordinare un datatable

Modifica: voglio darmi un pugno. Fare un DataView.Sort sulla vostra tavola, poi un DataView.ToTable() per inserire i dati ordinati in un nuovo insieme di dati ... Esempio:

Dim view As New DataView(OriginalDataSet) 'Put your original dataset into a dataview 
view.Sort = "ColumnName" ' Sort your data view 
Dim NewDataSet As DataTable = view.ToTable() ' Put your dataview into a new datatable 

Fine esempio

Ho un relativamente semplice tabella di esempio qui sotto, tratta da un sito web di insegnamento. L'unica differenza è che ci sono valori duplicati nella riga che sto cercando di ordinare.

Module Module1 

    Sub Main() 
    ' Get a DataTable instance from helper function. 
    Dim table As DataTable = GetTable() 
    End Sub 

    ''' <summary> 
    ''' Helper function that creates new DataTable. 
    ''' </summary> 
    Function GetTable() As DataTable 
    ' Create new DataTable instance. 
    Dim table As New DataTable 
    ' Create four typed columns in the DataTable. 
    table.Columns.Add("Dosage", GetType(Integer)) 
    table.Columns.Add("Drug", GetType(String)) 
    table.Columns.Add("Patient", GetType(String)) 
    table.Columns.Add("Date", GetType(DateTime)) 
    ' Add five rows with those columns filled in the DataTable. 
    table.Rows.Add(25, "Indocin", "David", DateTime.Now) 
    table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now) 
    table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now) 
    table.Rows.Add(21, "Combivent", "Janet", DateTime.Now) 
    table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now) 
table.Rows.Add(21, "Aspirin", "Janet", DateTime.Now) 
    Return table 
    End Function 

End Module 

Ho provato selezionando in una matrice, quindi scorrendo l'array e conclude ogni riga in un nuovo datatable, ma il prescelto non è afferrare righe. Esempio:

drarray = ds.Select ("Voglio selezionare tutti qui", "MySortColumn")

Ho provato varie strategie loop, con i loop interni, ecc e non riesco a capirlo .

Ho provato dataTable.DefaultView.Sort = "sortExp" ma non riesco a farlo funzionare.

Quindi cosa mi manca? Immagino con i metodi DefaultView e Select mi manca qualcosa in modo sintetico.

Quindi qual è il modo migliore per andare e cosa mi manca?

+0

Grazie. Ho trovato la modifica per essere utile. – mack

risposta

5

Utilizzare un DataView per creare una visualizzazione dei dati nel DataTable. Questo consente di ordinare, filtrare, ecc Ecco un esempio C#: Datatable VS dataview

+0

Ho trovato una risposta simile - http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx?cs-save-lang=1&cs-lang=vb#code-snippet- 1 Funziona. Un po 'di parole mi ci sono volute così tante ore per trovare quel collegamento ... Grazie, leggerò anche il tuo intero link. – BClaydon

+1

Questa NON è la risposta! Il questionario ha chiesto chiaramente come ordinare un DATATABLE. non vuole usare un dataview. La risposta di Steve è corretta. –

+1

@real_yggdrasil, non sono d'accordo. 'DataTable.selectI()' restituisce una matrice di oggetti 'DataRow', quindi non sta davvero ordinando il DataTable esistente. La versione di Steve crea un nuovo DataTable con copie delle righe selezionate. Un DataView viene utilizzato per applicare un filtro al DataTable esistente senza creare un nuovo DataTable. – ps2goat

14

Si può usare qualcosa di simile:

Return table.Select("","Columns to sort on").CopyToDataTable 
+0

Non riesco a trovare '.CopyToDataTable()'. Forse questo è un metodo di estensione nel tuo progetto? – Dejisys

+0

@Dejisys Disponibile a partire da .NET Framework 3.5. Dovresti iniziare una nuova domanda. – Steve

+0

Come ordinare i valori che contengono la virgola ("125.3654")? – Pliskin

1

Questo può aiutare sortExp può essere campo su cui base deve essere eseguita l'ordinamento filterExp che dovrebbe valutare true o false. assumendo i seguenti campi

Dim filterExp As String = "Patient<> ''" 
Dim sortExp As String = "Date " 
dt_item.Select(filterExp, sortExp, DataViewRowState.CurrentRows) 

Il codice precedente mostra come filtrare e ordinare la tabella di dati dt_item. L'espressione filtro seleziona Data il cui paziente non è NULL. L'espressione di ordinamento fa sì che i risultati vengano ordinati per la colonna Data