2015-08-06 3 views
5

Я использовал .Net framwork 4.0 с компонентом приложения WinForm DataGridView и установить DataSource с DataTable .Затем есть кнопка, чтобы добавить строку в DataGridView.DataTable выберите с Linq и проверки есть повторяющиеся строки или не

Этот код нравится.

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

Перед добавлением новой строки в DataTable Я проверил, есть ли дубликат row.To делать, что я использовал этот LINQ запрос.

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

Там после того, как я проверяю дублирующие строки доступны или нет в таблице данных?

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

Перед пойти следующий шаг Мне нужно, чтобы получить есть дубликат или нет, и установить его в isNotDuplicate переменного или подобную вещь, чтобы проверить это., поэтому я считаю, что подсчитывать строки results, но нет такой функции, чтобы считать «var results», любую возможность сделать это?

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.

Просто я ищу замену для этого с помощью 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.Field («Код товара»)). Где (g => g.Count()> 0) 'Вернет вам дубликаты. – Rob

+0

Duplicate as in ..? Все строки с одинаковым «Код товара»? –

+0

Когда я добавил новый элемент. Мне нужно проверить этот элемент уже в столбце таблицы данных «Код товара» – Elshan

ответ

0

Первый бросок его IEnumerable:

Convert DataRowCollection to IEnumerable<T>

Затем вы можете использовать методы расширения LINQ, чтобы сделать что-то вроде этого (чтобы проверить все значения, которые Повторяющиеся):

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

Если вы хотите проверить каждое значение для дубликата, вы можете нас е .Count метод, что-то вроде этого:

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

Хорошо, если по каким-то причинам это не работает, вы можете написать эту функцию самостоятельно:

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; 
    } 
} 

И использовать это нравится:

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

Ошибка: System.Data.EnumerableRowCollection "не содержит определения для« Count »и никакого метода расширения« Count », принимающего первый аргумент типа. * Что вы использовали версию .net framework? * – Elshan

+0

Это странно, попробуйте сначала преобразовать его с помощью метода .ToList() ... Я обновлю свой ответ ... Я использовал .Net 4.5 ... Обновил свой ответ методом .ToList() – Fabjan

+0

Жаль, что это не работает. – Elshan

1

Вы не указали, что в вашем DataTable, если вы ищете дубликаты для любого конкретного Item Code или для любого кода товара.В любом случае, вот код для обоих сценариев: -

Если вы ищете дубликаты для любого конкретного Item Code, то вы можете просто проверить счет, как это: -

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

Если вы ищете дублей во всем DataTable, а затем просто группы по Item Code и проверить соответствующий счетчик для каждого кода товара, как это: -

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

«EnumerableRowCollection » не содержит определения для «GroupBy», и не может быть найден метод расширения «GroupBy», принимающий первый аргумент типа «EnumerableRowCollection » (вам не хватает директивы использования или ссылки на сборку?) – GuidoG

+0

@GuidoG - У вас есть ссылка на _System.Linq_? Я уверен, что вам это не хватает. –

+0

да это был. Это происходит так, что они должны исправить это, поэтому он не будет компилироваться без этого использования и дать предупреждение о том, что вам не хватает использования ... – GuidoG

0

IEnumerable<T> имеет метод Count() (check here), если Вы не видите его в IntelliSense, то вам не хватает какой-то using инструкции, как using System.Linq; или какой-либо другой ...

Тогда вы бы просто сделать:.

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

'EnumerableRowCollection ' не содержать метода Count() – Elshan

+0

'EnumerableRowCollection ' реализует 'IEnumerable ' поэтому он ДОЛЖЕН содержать этот метод. Повторяю, если вы не видите это в intellisense, вам чего-то не хватает, но оно есть. – Pinx0

+0

Да, я не вижу его (Count()) в intellisense. Но нет ошибки. – Elshan