2

私は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;
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));

UPDATE 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 に答える