2012-12-04 52 views
2

一個DataGrid我有一個充滿對象DataGridView,現在我要爲這個DataGrid搜索/過濾功能。我試圖使用一個文本框,您可以輸入一個文本字符串,並在我的腦海中想要匹配這個字符串對所有的對象字段(例如,如果對象是電子郵件,我想匹配字符串與主題字段) DataGrid。如何篩選與對象C#

如果是到DataGrid.DataSource聲明如下任何幫助(不用擔心的方法,問題是過濾器/搜索功能):

var newMess = LM.GetNewMessages(); 
if (newMess.Count > 0) 
{ 
    for (int i = 0; i < newMess.Count; i++) 
    { 
     LM.InboxTemp.Insert(0, newMess[i]); 
    } 
} 
BindingSource source = new BindingSource(); 
source.DataSource = LM.InboxTemp; //List with Objects 
dgNewMess.DataSource = source; 
dgNewMess.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
dgNewMess.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
dgNewMess.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 
dgNewMess.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 

回答

5

如果你想過濾的集合電子郵件,您可以使用Linq。你也可以使用的List<Email>ForEach方法插入新的過濾電子郵件到您InboxTemp列表:

string filter = txtFilter.Text; 
LM.GetNewMessages() 
    .Where(msg => msg.Subject.Contains(filter)) 
    .ToList() 
    .ForEach(msg => LM.InboxTemp.Insert(0, msg)); 

UPDATEEquin.ApplicationFramework.BindingListView您可以指定數據源這樣

dgNewMess.DataSource = new BindingListView<Email>(LM.InboxTemp); 

並稍後應用過濾器

string filter = txtFilter.Text; 
BindingListView<Email> emails = (BindingListView<Email>)dgNewMess.DataSource; 
emails.Filter = new PredicateItemFilter<Email>(msg => msg.Subject.Contains(filter)); 
+0

我都已經充滿了對象(電子郵件)的列表,這個列表連接到DataGrid。我不想插入新的對象到列表中,我只是希望能夠顯示過濾的對象,取決於哪些搜索條件(從文本框)。我是否需要爲過濾對象使用不同的數據源?或者我可以使用相同的嗎? – MrProgram

+0

@ user1789325您在示例代碼中所做的操作是將電子郵件插入列表中,而不進行過濾。是否要過濾已分配給GridView的數據?順便說一句,它是WinForms還是什麼? –

+0

是的,它是WinForms。沒錯,DataGrid中已經充滿了電子郵件從列表 – MrProgram