我有一个填充了对象的DataGridView
,现在我想要一个DataGrid
的搜索/过滤功能。我正在尝试使用一个文本框,您可以在其中输入文本字符串,在我的脑海中想要将此字符串与所有对象字段匹配(例如,如果对象是电子邮件,我希望将字符串与“主题”字段匹配), 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;
答案 0 :(得分: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));
答案 1 :(得分:0)
看看这个项目:DataGridView Filter Popup