2012-12-04 55 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