2010-05-07 50 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 2010-05-07 20:00:26

回答

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 2010-05-07 20:09:56

+0

:)你的代碼看起來很棒,但是我的初始方法被誤導了。 – LFurness 2010-05-07 20:27:35

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 2010-05-07 19:45:44

+0

感謝您的回答,但ChrisF完全正確。 – LFurness 2010-05-07 19:49:09

+0

啊是的;我假設一個空網格。 – Pierreten 2010-05-07 19:50:04