c# - 如何使用对象 C# 过滤数据网格

标签 c# winforms

我有一个充满对象的 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;

最佳答案

如果您想过滤电子邮件集合,您可以使用 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));

关于c# - 如何使用对象 C# 过滤数据网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699672/

相关文章:

.net - .NET WinForms 中最大化 MDI 子项的多个控制按钮

c# - C# 中的任意精度小数?

C# WinForms trayapp MenuItem 鼠标悬停检测

c# - 动态构建 Func<t,t> 列表 - 然后应用于 linq 查询

c# - 带有伪选择器(和引导图标)的 ASP.NET Core asp-fallback 标记帮助器

c# - 如何在 WinForms 中将字典绑定(bind)到组合框?

c# - 将 HTML 表信息从 MVC View 传递到 Controller ?

vb.net - 折线图的滚动条 VB.NET

.NET .resx 文件 : why does name attribute often start with &gt;&gt;

c# - winform应用程序中按钮不可见