2010-05-07 2 views
3

Я использую цикл foreach для заполнения каждой строки в DataGridView строкой. Мне нужно найти DataGridView, чтобы убедиться, что я не добавляю строку, которая уже существует. Каков наилучший способ сделать это?найти строку в DataGridView

Вот мой код до сих пор:

foreach (String file in openFileDialog.FileNames) 
    {          
     // todo: make sure file string does not already exist in DataGridView 
     dataGridView1.Rows.Add(); 
     dataGridView1.Rows[i].Cells[1].Value = file; 
     i++; 
    } 

Пожалуйста, обратите внимание, что уже может быть имена файлов в DataGridView из предыдущего запуска кода.

+0

см. Обновленный ответ – hunter

ответ

4

Это хорошая идея не использовать DataGridView как хранилище данных. Это элемент управления для отображения материала.

Лучше привязать его к какой-то резервное хранилище и сделать ваши операции на что:

var table = new HashSet<string>(); 

table.Add("aa"); 
table.Add("bb"); 
table.Add("aa"); 

dataGridView1.AutoGenerateColumns = true; 
dataGridView1.DataSource = table.ToList(); 

И когда новая новая партия файлов приходит, добавьте их в HashSet и просто заново привязать Сетка.

2

Я думаю, что это будет делать:

foreach(string file in dialog.FileNames) 
    if (!dataGridView1.Rows.Cast<DataGridViewRow>().Any(r => r.Cells[1].Value == file)) 
     dataGridView1.Rows.Add(new string[]{ file }); 
+1

Да ладно! Там так много вещей LINQ, что он больной, просто больной. Смотри! У вас есть Cast <> и Any()! Это золото, которое я вам скажу, чистое золото! – hunter

+0

:) Ваш код выглядит потрясающе, но мой первоначальный подход был ошибочным. – LFurness

2
foreach (String file in openFileDialog.FileNames.Distinct()) 
    {          
     // todo: make sure file string does not already exist in DataGridView 
     dataGridView1.Rows.Add(); 
     dataGridView1.Rows[i].Cells[1].Value = file; 
     i++; 
    } 

(Предполагая, что C# 3.0 и расширения LINQ для IEnumerable <>)

+0

Хотя это приведет к удалению дубликатов из этого 'openFileDialog', он не проверяет, не указано ли это имя в сетке данных из предыдущего запуска кода. – ChrisF

+0

Спасибо за этот ответ, но ChrisF точно прав. – LFurness

+0

Ах да; Я принимал пустую сетку. – Pierreten

Смежные вопросы