2014-09-28 16 views
6

Ho un datatable e una riga. Voglio importare la riga nel datatable solo se non esiste nel datatable.Controllare se esiste una riga in DataTable?

Come posso farlo?

+2

Avete una chiave nella riga (come si dovrebbero)? – TaW

+0

No non ce l'ho, non esiste un metodo come "contiene" o "esiste"? – Curious

+1

@TamerMemili Ha [Contains] (http://msdn.microsoft.com/en-us/library/0hc992ac (v = vs.110) .aspx), ma funzionerà solo con le tabelle che contengono PK. –

risposta

10

Se si utilizza un DataSet tipizzato, cioè dichiarato in fase di progettazione, il "metodo linq Contains" prende un DataRow tipizzato. IEqualityComparer predefinito confronterà tutti i valori nella DataRow. (Che è normalmente inutile, dal momento che si dovrebbe avere una chiave definita).

DataSet1 ds = new DataSet1(); 
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla); 
bool exists = ds.DataTable1.Contains(row); 
+0

è [un'estensione] (http://stackoverflow.com/a/34438198/2404470) utile? – xameeramir

+0

Bene, il "metodo LINQ contiene" di cui sopra è già un'estensione di metodo. SE la tua estensione stava facendo qualcosa di utile, POTREBBE aggiungere un certo valore all'estensione implementata da MS. – S22

+0

Aggiungerei .. è necessario aver definito una chiave primaria sulla tabella anche se non si utilizza un set di dati tipizzato. –

6

È possibile utilizzare LINQ per verificare se la riga è presente in datatable. Segui questa soluzione e sostituisci "id" con la chiave primaria della tua riga, in cui puoi identificare in modo univoco una riga in una tabella.

DataRow dr = null; // assign your DR here 
DataTable dt = new DataTable(); // assign Datatable instance here. 
var k = (from r in dt.Rows.OfType<DataRow>() where r["id"].ToString() == dr["id"].ToString() select r).FirstOrDefault(); 
if(k != null) 
{ // Row is present } 
7

se si desidera controllare tutti i cells in un DataRow, si può provare questa funzione:

bool ContainDataRowInDataTable(DataTable T,DataRow R) 
{ 
    foreach (DataRow item in T.Rows) 
    { 
     if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray)) 
      return true; 
    } 
    return false; 
} 
0
if (Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted") 
+3

Non indirizza la domanda – Grantly

3

è possibile utilizzare Contains come di seguito

if(DataTable.Columns.Contains("RowName")) 
{ 
    //Do some stuffs here 
} 
0

si dovrebbe verificare riga esistenza confrontando le chiavi primarie:

static bool RowExists(DataTable table, DataRow row) 
{ 
    var pk = table.PrimaryKey 
       .Select(column => row[column, DataRowVersion.Original]) 
       .ToArray(); 

    return table.Rows.Contains(pk); 
}