簡體   English   中英

如何使用 TextBox 過濾 DataGridView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM