2012-04-25 5 views
6

Come posso filtrare i dati provenienti da set di dati per DataTable? come il code->Get filtrati i dati dal set di dati al DataTable

DataRow[] dr = DS.Tables[0] 
    .Select("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");   

Come posso usare DataTable qui?

seguente codice doesn`t riflettere Revisioni->

DataTable FilteredDataD = DS.Tables[0]; 
if (FilteredDataD.Rows.Count > 0) { 
    FilteredDataD.DefaultView.RowFilter = "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"; 
    FilteredDataD.DefaultView.ToTable(); 
} 

È 'possibile rimuovere una colonna con sopra il filtro, come "stagename = 'Sviluppare' E DEVLAPSEDAYS IS NOT NULL" + FilteredDataD.column (" nome_col ") ... Supponiamo che io sono 5 colonne visualizzano solo 4, posso` t rimuovere nome_col dai miei query.Is esiste un modo?

Rispondi

risposta

11

Prova utilizzando LINQ invece:

var table = DS.Tables[0].AsEnumerable().Where(
    r => r.Field<string>("STAGENAME") == "Develop" && r.Field<int?>("DEVLAPSEDAYS").HasValue).AsDataView().ToTable(); 

EDIT cambiato AsDataView-AsDataView() per la precisione sintattica.
EDIT fornito NET 2.0 soluzione compatibile

DataTable table = DS.Tables[0]; 
if (table.Rows.Count > 0) 
{ 
    table.DefaultView.RowFilter = "STAGENAME = 'DEVELOP' AND DEVLAPSEDAYS IS NOT NULL"; 
    table = table.DefaultView.ToTable(); 
} 
+0

James, AsEnumerable() couldn trovare nel mio VS, 'm utilizzando .net 2.0 version.Reply – palak

+0

@JamesJohnson +1, ho wa non a conoscenza di "vedute" di essere utilizzato su insiemi di dati e così via. Questa è una bella soluzione. – Matt

+0

@JamesJohnson: Ciao James, grazie per la risposta, ma questo non funziona per me, il filtraggio non sta accadendo. – palak

6

Si potrebbe scrivere un metodo di estensione (utilizzando C# 3) Mi piace segue:

public static DataTable Filter(this DataTable dataTable, string selectFilter) 
{ 
    var filteredTable = dataTable.Clone(); 
    var rows = dataTable.Select(selectFilter).ToList(); 
    rows.ForEach(filteredTable.ImportRow); 
    return filteredTable; 
} 

quindi utilizzarlo come segue:

DataTable dataTable = DS.Tables[0] 
    .Filter("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"); 

aggiornamento, da quando hai detto che stai usando C# 2.0 (e quindi i metodi di estensione e LINQ aren 'T opzione) è possibile utilizzare questo invece:

public static DataTable GetFilteredTable(
    DataTable sourceTable, string selectFilter) 
{ 
    var filteredTable = sourceTable.Clone(); 
    var rows = sourceTable.Select(selectFilter); 
    foreach (DataRow row in rows) 
    { 
     filteredTable.ImportRow(row); 
    } 
    return filteredTable; 
} 

DataTable dataTable = GetFilteredTable(
    DS.Tables[0], "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL"); 
+0

Matt, Grazie per la risposta, 'm non trovando riferimento per ToList(), I' m utilizzando C# 2.0 .. – palak

+0

@palak, aggiornato la mia risposta . – Matt

+0

@Matt: la prima risposta è un modo indiretto di fare ciò che 'DataTable.DefaultView.RowFilter' fa. –