2

我有一个DataGridView充满对象的对象,现在我想要一个搜索/过滤功能DataGrid。我正在尝试使用一个文本框,您可以在其中输入一个文本字符串,并且在我的脑海中想要将此字符串与所有对象字段进行匹配(例如,如果对象是电子邮件,我想将字符串与主题字段进行匹配)数据网格。

如果有任何帮助,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;
4

2 回答 2

5

如果你想过滤收集的电子邮件,你可以使用 Linq。您还可以使用ForEach的方法List<Email>将新过滤的电子邮件插入到您的InboxTemp列表中:

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

使用Equin.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));
于 2012-12-04T09:32:05.147 回答
0

看看这个项目:DataGridView Filter Popup

于 2012-12-04T09:35:39.810 回答