Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
62 / 6 / 1
Регистрация: 09.09.2012
Сообщений: 137

Фильтрация данных в DataGridView в зависимости от значения в txtBox по событию TextChanged

12.03.2019, 22:45. Показов 3285. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Имеется форма с двумя TextBox (textBox1 и textBox2), а также DataGridView (dgvAll)

в классе DAL содержится информация о строке подключения и ArrayList для отображения в dgvAll

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database.accdb;Persist Security Info=False;";
 
 
        public ArrayList GetAllInfo()
        {
            ArrayList allInfo = new ArrayList();
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                OleDbCommand com = new OleDbCommand("SELECT tbl_Region.Region, tbl_Company.Company, tbl_Expert.Expert, tbl_Expert.Otdel FROM ((tbl_Region RIGHT JOIN tbl_Company ON tbl_Region.id_Region = tbl_Company.id_Region) RIGHT JOIN tbl_Expert ON tbl_Company.id_Company = tbl_Expert.id_Company)", con);
 
                try
                {
                    con.Open();
                    OleDbDataReader dr = com.ExecuteReader();
                    if (dr.HasRows)
                        foreach (DbDataRecord result in dr)
                            allInfo.Add(result);
                    else
                    {
                        MessageBox.Show("Отсутствует информация для отображения", "Информация", MessageBoxButtons.OK);
                    }
                }
                catch
                {
                }
 
            }
            return allInfo;
        }
Заполнение dgvAll происходит таким образом

C#
1
2
3
4
        private void Form1_Load(object sender, EventArgs e)
        {
            dgvAll.DataSource = dal.GetAllInfo();
        }
Помогите пожалуйста реализовать фильтрацию отображаемой информации в dgvAll в зависимости от набираемого текста в textBox1 и textBox2

C#
1
2
3
4
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
              //
        }
Добавлено через 46 минут
Пока смог реализовать только вот таким способом:
для этого отказался в основной форме от класса DAL и поправил код основной формы

подписал textBox1 и textBox2 на одно и то же событие TextChanged
C#
1
2
3
4
5
6
7
8
9
10
        private void textBox_TextChanged(object sender, EventArgs e)
        {
            con = new OleDbConnection(cs);
            con.Open();
            adapt = new OleDbDataAdapter("SELECT tbl_Region.Region, tbl_Company.Company, tbl_Expert.Expert, tbl_Expert.Otdel FROM ((tbl_Region RIGHT JOIN tbl_Company ON tbl_Region.id_Region = tbl_Company.id_Region) RIGHT JOIN tbl_Expert ON tbl_Company.id_Company = tbl_Expert.id_Company) WHERE (tbl_Region.Region like '%" + textBox1.Text + "%' AND tbl_Expert.Expert like '%" + textBox2.Text + "%')", con);
            dt = new DataTable();
            adapt.Fill(dt);
            dgvAll.DataSource = dt;
            con.Close();
        }
Код формы тоже подправил, добавив вот это

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.Common;
using System.Collections;
using System.Threading;
 
namespace TestDB
{
    public partial class MainForm : Form
    {
        string cs = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database.accdb;Persist Security Info=False;";
 
        OleDbConnection con;
        OleDbDataAdapter adapt;
        DataTable dt;
Добавлено через 31 минуту
Возникла проблема, помогите решить

в некоторых ячейках, по которым идет фильтрация (tbl_Expert.Expert), ничего не содержится, поэтому запрос

C#
1
SELECT tbl_Region.Region, tbl_Company.Company, tbl_Expert.Expert, tbl_Expert.Otdel FROM ((tbl_Region RIGHT JOIN tbl_Company ON tbl_Region.id_Region = tbl_Company.id_Region) RIGHT JOIN tbl_Expert ON tbl_Company.id_Company = tbl_Expert.id_Company) WHERE (tbl_Region.Region like '%" + textBox1.Text + "%' AND tbl_Expert.Expert like '%" + textBox2.Text + "%')
некорректен и приводит к ошибочной выборке. Например, при первоначальной загрузке общее число значений 500, а если сначала сделать любую выборку, а потом отменить её, то общее число значений станет меньше и составит 420. Таким образом, пропали значения, которые NULL (Если я правильно выразился конечно).

Помогите пожалуйста исправить запрос.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2019, 22:45
Ответы с готовыми решениями:

Фильтрация в combobox в зависимости от выбора значения
Добрый вечер. Во вложении файл. Необходима помощь в решении следующей проблемы: Существует лист "приход" поступление...

Фильтрация данных в зависимости от выбора в ComboBox
Помогите организовать поиск(фильтрацию)во второй вкладке Combobox результат вывести в таблицу(таблицу я просто скопипастил из первой...

Фильтрация данных в DGV в зависимости от выбора в ComboBox
На форме лежат 2 компонента combobox и datagredview. В базе данных 2 таблицы связанных filterTypes и filterValues. в комбобокс отображены...

7
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.03.2019, 23:22
Kaliostro82,
Во-первых, не вставляйте параметры непосредственно в SQL запросы. Это приводит к ошибочным запросам в лучшем случае, и к взлому БД в худшем.
Используйте SqlParameter.

Во-вторых, раз уж вы уже имеете полностью загруженную выборку, то делать новую выборку в БД при каждом изменении текстбокса - долго и не рационально. Нужно фильтровать уже загруженную выборку.
Для этого
1) Замените ArrayList (который кстати уже устарел лет как 15, вместо него - List<T>) на связку DataTable + DataView.
2) В грид передавайте DataView в качестве источника данных DataSource.
3) Фильтрацию проводите в DataView.
0
62 / 6 / 1
Регистрация: 09.09.2012
Сообщений: 137
13.03.2019, 12:15  [ТС]
Storm23,
Я учусь на чужих примерах, поэтому и использую устаревшие конструкции, с этим уж ничего не поделаешь. Но я готов, и с удовольствием, прислушиваться к Вашему мнению и изменить код, но мне нужна Ваша помощь.

Напишите пожалуйста примеры по пунктам, о которых Вы говорите.

Добавлено через 4 минуты
У меня получается пока так

C#
1
2
3
4
5
6
7
OleDbDataAdapter adapt;
DataView dv;
 
DataSet ds = new DataSet();
adapt.Fill(ds);
dv = ds.Tables[0].DefaultView;
DataGridView.DaraSource = dv;
Добавлено через 3 минуты
Если я правильно понимаю, то я привел пример пункта 2 о котором Вы сказали. Правильно?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.03.2019, 12:58
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
Напишите пожалуйста примеры по пунктам, о которых Вы говорите.
1) Создаем новое приложение WinForms.
2) Создаем файл конфигурации app.config.
В этом файле прописываем Connection String к нашей БД (я буду конектится к стандартной БД Northwind):
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Main" connectionString="Data Source=.; Initial Catalog=Northwind; Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>


3) Добавляем к проекту System.Configuration.dll (как - описано здесь). Эта длл нужна для того, что бы мы получили доступ к connectionStrings из файла конфигурации.

4) Создаем папку DAL. В ней создаем класс Repository. Содержимое класса:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public class Repository
    {
        string MainConnectionString
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
            }
        }
 
        public DataTable GetProducts(int categoryId)
        {
            var sql = "SELECT * FROM Products WHERE CategoryId = @categoryId";
 
            using (var conn = new SqlConnection(MainConnectionString))
            using (var comm = new SqlCommand(sql, conn))
            {
                comm.Parameters.AddWithValue("categoryId", categoryId);
                var dt = new DataTable();
                new SqlDataAdapter(comm).Fill(dt);
                return dt;
            }
        }
    }

Этот класс будет использоваться для получения данных из БД. Я сделал один метод - GetProducts - для получения продуктов. В метод передается код категории из которой мы хотим получить продукты.

5) На главную форму кидаем DGV и текстбокс для фильтра.
В форме создаем метод Build:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void Build()
        {
            //load data is not presented
            if (data == null)
            {
                data = new Repository().GetProducts(1);
                view = new DataView(data);
            }
 
            //build row filter
            var nameFilter = tbProductNameFilter.Text;
            if (string.IsNullOrEmpty(nameFilter))
                view.RowFilter = "";
            else
                view.RowFilter = string.Format("ProductName LIKE '%{0}%'", nameFilter);
 
            //populate data to DGV
            dgvProducts.DataSource = null;
            dgvProducts.DataSource = view;
        }

Этот метод загружает DataTable из Repository (если еще не загружено), создает DataView, фильтрует его и выводит информацию в DGV.

6) Создаем обработчик события TextChanged для текстбокса фильтра. В обработчике - просто вызываем Build();

Результат:


Проект целиком:
Вложения
Тип файла: zip WindowsFormsApplication403.zip (55.9 Кб, 38 просмотров)
1
62 / 6 / 1
Регистрация: 09.09.2012
Сообщений: 137
13.03.2019, 16:00  [ТС]
Эхх, на работе не получается это реализовать, буду дома пробовать. Отпишусь по результатам.

Добавлено через 22 минуты
Storm23,
просьба ещё есть, помоги с реализацией процесса передачи информации из отсортированного уже DataView, то есть событие CellMouseDoubleClick по DataGridView, на котором прошли изменения после фильтрации

Добавлено через 2 минуты
На текущий момент времени у меня реализован процесс передачи информации на другую форму в TextBox, но это работает только в том случае, если не было фильтрации
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.03.2019, 16:06
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
помоги с реализацией процесса передачи информации из отсортированного уже DataView, то есть событие CellMouseDoubleClick по DataGridView, на котором прошли изменения после фильтрации
C#
1
2
3
4
5
6
7
8
9
10
        private void dgvProducts_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //get DGV row
            var row = dgvProducts.Rows[e.RowIndex];
            //get DataView row
            var dataRowView = row.DataBoundItem as DataRowView;
            //get DataTable row
            var dataRow = dataRowView.Row;
            //...
        }
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
На текущий момент времени у меня реализован процесс передачи информации на другую форму в TextBox, но это работает только в том случае, если не было фильтрации
Читали FAQ?
1
62 / 6 / 1
Регистрация: 09.09.2012
Сообщений: 137
13.03.2019, 21:08  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Читали FAQ?
Я заходил, читал бегло, не вдумываясь. Я понимаю, что там хорошо написано, но мне тяжело это понимать, потому что я учусь самостоятельно, не имя базового знания, образования. Работа тоже у меня с этим не связана.. Вообщем тяжело.

Вот пришел домой, пытаюсь разобраться с Вашими предложениями.

Добавлено через 30 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
Проект целиком:
Вложения
Тип файла: zip WindowsFormsApplication403.zip
заменил подключение на свою базу, пока вытягиваю только одно значение. Первое что не могу понять, так это вот эту строчку
C#
1
data = new Repository().GetProducts(1);
это же приводит к тому, что заносятся данные только одного типа (1).
Как следует вносить всю информацию полностью? Особенно если требуется объединение трёх таблиц с помощью JOIN.

Добавлено через 31 минуту
Цитата Сообщение от Storm23 Посмотреть сообщение
Во-первых, не вставляйте параметры непосредственно в SQL запросы. Это приводит к ошибочным запросам в лучшем случае, и к взлому БД в худшем.
Используйте SqlParameter.
У меня используется
C#
1
Provider=Microsoft.ACE.OLEDB.12.0
Я так понял, что в таком случае с параметрами не так все просто, особенно учитывая, что до этого я их не использовал вообще.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.03.2019, 23:37
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
это же приводит к тому, что заносятся данные только одного типа (1).
Ну это же просто пример. Я передаю параметр, что бы показать как использовать SqlParameter внутри метода GetProducts.
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
Как следует вносить всю информацию полностью?
Для каждого типа запросов нужно написать отдельный метод в репозитории.
Если нужно получить все данные, без параметров - значит нужно написать метод GetProducts() - без параметров.
Цитата Сообщение от Kaliostro82 Посмотреть сообщение
Provider=Microsoft.ACE.OLEDB.12.0
Это не важно, SqlParameter-ы поддерживаются везде. Могут быть нюансы, но не принципиальные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2019, 23:37
Помогаю со студенческими работами здесь

Фильтрация данных в DGV в зависимости от установленных CheckBox
Есть форма с несколькими чекбоксами для фильтрации массива данных и грид для отображения инфы. Обработка события построена следующим...

Фильтрация данных с DataGridView
Следующий код выдает ошибку &quot;№ абонента&quot;- столбец в базе имеет тип счетчик string s = &quot;№ абонента&quot; + &quot; %&quot; +...

Фильтрация данных в DatagridView
Нужно реализовать в Datagridview возможность, по необходимости фильтровать в моем случае &quot;Заявки&quot; на...

Фильтрация данных в datagridview
Добрый день, есть dgv заполненный данным, хочу его отфильтровать, написал следующий код: private void...

Фильтрация выводимых в datagridview данных
Здравствуйте. Есть два datagridview, связанные по полю ID. Во тором gride есть колонка содержащая год. Как сделать так, чтобы во втором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru