[英]How to filter DataGridView using TextBox
我還沒有太多經驗。 我正在嘗試過濾包含輸入文本的行。 為了.. 我使用 MailKit 接收傳入的消息並將來自它們的數據放入 Grid
public void ShowMessages(ImapClient client)
{
var inbox = client.Inbox;
inbox.Open(FolderAccess.ReadOnly);
var query = SearchQuery.All;
var uids = inbox.Search(query);
var items = inbox.Fetch(uids, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure).Reverse();
foreach (var item in items)
{
...
dataGridMessages.Rows.Add(read, item.Envelope.Subject, item.Envelope.From, item.Envelope.Date, attach, item.Size, false, item.UniqueId);
}
}
然后我嘗試過濾行
private void searchTxb_TextChanged(object sender, EventArgs e)
{
BindingSource bs = new BindingSource();
bs.DataSource = dataGridMessages.DataSource;
bs.Filter = string.Format("Subject LIKE '%{0}%'", searchTxb.Text);
dataGridMessages.DataSource = bs;
}
但在輸入文本后,網格為空,什么也沒找到。 請告訴我我做錯了什么?
您的問題是由於您一次填充網格一行而直接添加一行。 這樣,DataSource 屬性未設置為任何內容,如果要過濾,則需要逐一循環遍歷行並刪除不需要的行。
或者,您可以使用BindingList<T>
其中 T 是您在代碼中定義的自定義 class ,其中僅包含您希望在網格中顯示的屬性。 定義了這個 class 后,您可以創建實例以添加到 BindingList 構造函數中使用的列表
所以假設有一個像這樣的 class
private class MailItem
{
public string Subject {get;set;}
public string From {get;set;}
public DateTime DateSent {get;set;}
}
以及類型形式中的全局變量
List<MailItem> rows = new List<MailItem>();
為簡單起見,我只添加了一些屬性,但您可以輕松添加其他屬性。
現在,當您需要填充網格時,請使用它
...
rows.Clear();
var items = inbox.Fetch(uids, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure).Reverse()
foreach(var item in items)
{
rows.Add(new MailItem {
Subject = x.Envelope.Subject,
From = x.Envelope.From,
DateSent = x.Envelope.Date
};
}
現在您可以創建 BindingList 並將其設置為網格的 DataSource
BindingList<MailItem> bs = new BindingList<MailItem>(rows);
dataGridMessages.DataSource = bs;
最后一步是過濾代碼。 在這里,您需要提取要使用的行並應用過濾器
BindingList<MailItem> currentFilter = new BindingList<MailItem>(rows);
dataGridMessages.DataSource = currentFilter.Where(x => x.Subject.Contains(searchTxb.Text)).ToList();
請注意,您需要保留通過調用 Fetch 檢索到的原始行集,以便您可以在用戶更改文本框內容時應用不同的過濾器。 因此,MailItem 列表應該為您的表單保持全局
或者,您可以再次調用 Fetch,但即使僅檢索 100 個元素,此方法似乎也很慢。 更好的 model (恕我直言)是實現一個按鈕並在該按鈕單擊時調用過濾器。
(BindingList 需要使用 System.ComponentModel )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.