2015-08-06 4 views
5

ho usato .Net 4.0 framwork con il componente applicazione WinForm DataGridView e impostare DataSource con DataTable .Poi c'è un pulsante per aggiungere riga in DataGridView.DataTable selezionare con LINQ e controllo è lì righe duplicate o no

Tale codice come questo.

gridTable = (DataTable)dgrMainGrid.DataSource; 
DataRow dr = gridTable.NewRow(); 

Prima di aggiungere Nuova riga in DataTable ho controllato se c'è un duplicato row.To farlo ho usato questo LINQ Query.

//Item Code cannot duplicate 
var results = from itmCode in gridTable.AsEnumerable() 
       where (itmCode.Field<string>("Item Code") == txtGrdItmLoc.Text) 
       select itmCode; 

Ci dopo come controllo le righe duplicate disponibile o meno nella tabella dei dati?

if(//doWhatever function here){ 
    //if there's duplicate row values 
    isNotDuplicate = false; 
} 
else{ 
    isNotDuplicate=true; 
} 

Prima di andare al passo successivo ho bisogno di ottenere c'è un duplicato o meno e impostare in variabile isNotDuplicate o cose simili per controllare che. quindi penso di contare le righe results ma non esiste una funzione del genere per contare i "risultati var", Qualche possibilità di farlo?

if (!isDuplicate) 
{ 
    dr["#"] = true; 
    dr["Item Code"] = lSysItemCode; 
    dr["Stock Code"] = txtGdrItmItemLoc.Text; 
    dr["Brand"] = txtGrdItmBrand.Text; 
    dr["Model No"] = cmbGrdItmModel.SelectedValue.ToString(); 
    gridTable.Rows.Add(dr); 
    dgrMainGrid.DataSource = gridTable; 
} 

I can use for loop with DataTable and check whether it's contain new value that equals to "Item Code" but I looking alternative method with linq.

semplicemente che sto cercando di sostituzione per questo utilizzando LINQ.

foreach (DataRow r in gridTable.Rows) { 
      if (r["Item Code"].ToString() == txtGrdItmLoc.Text) { 
        isDuplicate = true; 
      } 
     } 

Sample Project : http://1drv.ms/1K4JnHt

Sample Code : http://pastebin.com/v7NMdUrf

+2

'gridTable.AsEnumerable() GroupBy (g = > g.Field ("Codice articolo")). Dove (g => g.Count()> 0) 'Restituirà i duplicati. – Rob

+0

Duplicato come in ..? Tutte le file con lo stesso 'codice articolo '? –

+0

Quando ho aggiunto un nuovo elemento. Devo controllare quell'elemento già nella colonna della tabella di dati "Codice articolo" – Elshan

risposta

0

primo cast a IEnumerable:

Convert DataRowCollection to IEnumerable<T>

quindi è possibile utilizzare metodi di estensione LINQ per fare qualcosa di simile (per controllare tutti i valori che ha duplicati):

var duplicates = resultsList.Where(r => resultsList.Count(r2 => r2.Field<string>("Item Code") == r.Field<string>("Item Code")) > 0); 

Se si desidera verificare ogni valore per duplicato ci si può e .Count metodo, qualcosa di simile:

bool hasDuplicates = resultsList.Count(r2 => r2.Field<string>("Item Code") == "your code") > 1; 

Ok, se per qualche motivo questo non funziona è possibile scrivere questa funzione da soli:

public static class Helper 
{ 
            // or other collection type 
    public static int MyCount<T>(this IEnumerable<T> collection, Func<T, bool> function) 
    {    
     int count = 0; 
     foreach (T i in collection) 
      if (function(i)) ++count; 
     return count; 
    } 
} 

e usarlo come:

results.MyCount(r => r.Field<string>("Item Code") == "Item Code"); 
+0

Errore: System.Data.EnumerableRowCollection 'non contiene una definizione per' Count 'e nessun metodo di estensione' Count 'accetta un primo argomento di tipo. * Che cosa hai usato .net versione framework? * – Elshan

+0

È strano, provate a convertirlo con il metodo .ToList() prima ... aggiornerò la mia risposta ... Ho usato .Net 4.5 ... Ho aggiornato la mia risposta con il metodo .ToList() – Fabjan

+0

Spiacente, non funziona. – Elshan

1

Non hai chiarito questo nel tuo DataTable se stai cercando duplicati per uno specifico Item Code o per qualsiasi Codice Articolo.In ogni modo, ecco il codice per entrambi gli scenari: -

Se siete alla ricerca di duplicati per ogni specifica Item Code allora si può semplicemente controllare il conteggio in questo modo: -

bool istxtGrdItmLocDuplicate = gridTable.AsEnumerable() 
         .Count(x => x.Field<string>("ItemCode") == txtGrdItmLoc.Text) > 1; 

se siete alla ricerca di duplicati in tutta la DataTable, poi semplicemente di gruppo da Item Code e controllare il relativo conteggio per ciascun Codice Articolo in questo modo: -

bool isDuplicate = gridTable.AsEnumerable() 
          .GroupBy(x => x.Field<string>("ItemCode") 
          .Any(x => x.Count() > 1); 
+0

'EnumerableRowCollection ' non contiene una definizione per 'GroupBy' e non è possibile trovare alcun metodo di estensione 'GroupBy' che accetta un primo argomento di tipo 'EnumerableRowCollection ' (manca una direttiva using o un riferimento assembly?) – GuidoG

+0

@GuidoG - Hai aggiunto un riferimento a _System.Linq_? Sono sicuro che ti manca. –

+0

sì è stato. Questo succede così tanto che dovrebbero aggiustarlo in modo che non possa essere compilato senza quell'uso e dare un avvertimento che ti manca un utilizzo ... – GuidoG

0

IEnumerable<T> ha un metodo Count() (check here), se non si è visto in IntelliSense poi si sono dispersi un po 'using di istruzioni, come using System.Linq; o qualche altro ...

allora si dovrebbe fare solo:.

if(results.Count()>0){ 
//if there's duplicate row values 
isNotDuplicate = false; 
} 
else 
{ 
    isNotDuplicate=true; 
} 
+0

'EnumerableRowCollection ' non contiene il metodo Count() – Elshan

+0

'EnumerableRowCollection ' implementa 'IEnumerable ' quindi DEVE contenere tale metodo. Ripeto, se non lo vedi in intellisense, ti manca qualcosa, ma è lì. – Pinx0

+0

Sì, lo trovo dint (Count()) in intellisense. Ma non ci sono errori. – Elshan