Как фильтровать DataGridView с помощью 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;
}
но после набора текста грид пустой, ничего не находит. Подскажите пожалуйста, что я делаю не так?
Ответы (1 шт):
Вы присваиваете bs.DataSource = dataGridMessages.DataSource;, потом dataGridMessages.DataSource = bs;, потом жмете букву на клавиатуре и процесс повторяется. То есть каждый последующий bs указывает на предыдущий bs. Получается рекурсивная каша, сингулярность, вселенная схлопывается.
Вы не можете просто так взять строки таблицы и использовать их как источник данных через фильтр для них же самих.
Кстати, при первом присваивании вот здесь
bs.DataSource = dataGridMessages.DataSource;
Вы чего ожидаете внутри DataSource? Строки DGV? Но строки это же не источник данных, а приемник, верно? То есть в DataSource будет ровно то, что ранее вы присвоили туда, а если ничего не присвоили, то ничего там и нет, null.
Вот так можно выйти из этой проблемной ситуации: Привязка данных в DataGridView, а именно перестать использовать строки DataGridView как хранилище данных.