Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140

Как отловить изменения в dataGridView и сохранить в БД

21.01.2014, 21:34. Показов 5031. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Нужно отловить изменение ячеек колонки типа CheckBoxColumn и соответственно сохранить изменение в БД. Пока что в гриде всем поля, кроме CheckBox, запрещено изменение.
Желательно, чтобы после после изменения какого либо поля, изменения сразу сохранялись в БД.
Как это реализовать?

Добавлено через 19 минут
Пытаюсь попробовать сделать через событие CellValueChanged
Но возникло ряд ошибок:
- при запуске приложения появлялась ошибка "Ссылка на объект не указывает на экземпляр объекта."
временное решение - добавил if
- Сейчас при изменении ячейки появляется ошибка Не удалось привести тип объекта "System.Windows.Forms.BindingSource" к типу "System.Data.DataSet".


C#
1
2
3
4
5
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridView1.RowCount != 0)
                da.Update((DataSet)dataGridView1.DataSource);
        }
Код заполнения грида
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 string sSql = "select * from plat";
            MySqlConnection con = new MySqlConnection();
            con.ConnectionString = "Database=fixplat;Data Source=localhost;User Id=root;Password=;charset=utf8;";
            con.Open();
             MySqlCommand cmd = new MySqlCommand(sSql, con);
            DataSet ds = new DataSet();
            da = new MySqlDataAdapter(cmd);
            MySqlCommand cmd1 = new MySqlCommand("select *from pcalc", con);
            MySqlDataAdapter da1 = new MySqlDataAdapter(cmd1);
            
            da.Fill(ds, "plat1");
            da1.Fill(ds, "pcalc");
 
            DataRelation dataRelation = new DataRelation("RNPFR1", ds.Tables["plat1"].Columns["RNPFR"], ds.Tables["pcalc"].Columns["RNPFR"]);
            ds.Relations.Add(dataRelation);
dataGridView1.DataSource = new BindingSource(ds, "plat1");
            dataGridView2.DataSource = new BindingSource(dataGridView1.DataSource, "RNPFR1");
Да еще заметил, что почему то при нажатии на первый чекбокс событие не возникает, а после нажатия на второй срабатывает.

Добавлено через 1 час 37 минут
Да и еще у меня есть кнопки типа пометить/разметить чек боксы. Так вот при нажатии кнопок этих получается даже при небольшом количестве данных, может получить приличное количество запросов к БД.
Как это учесть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2014, 21:34
Ответы с готовыми решениями:

Сохранить изменения в dataGridView
Доброго времени суток. Нужно сохранить все внесенные в dataGridView изменения. К базе подключался через средства Visual Studio, поэтому...

Изменения в DataGridView сохранить в БД
Здравствуйте. Извиняюсь, но такую тему найти на форуме не смог. Хотя похожих просмотрел очень много. Если уже было - дайте ссылку. ...

Сохранить изменения, сделанные в DataGridView, в БД, используя хранимую процедуру
Есть DataGridView. Они берутся из БД без всяких заморочек. В DataGridView вводятся данные. Их нужно сохранить в БД. Сохранить можно...

4
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 46
22.01.2014, 07:07
Я, конечно, многого не понимаю, но, возможно, смогу вам помочь.

По-идее DataGridViewComboBoxColumn должен автоматически сохранять изменения в датасет/тейбл, к которому привязан GridView. Как у вас происходит добавление DataGridViewComboBoxColumn в GridView?

Метод da.Update должен принимать либо коллекцию строк, либо DataTable, либо DataSet + название таблицы в нем. Не получится ли обновлять БД так: da.Update(ds, "plat1");

Что по поводу обращения к БД, все зависит от конкретной ситуации. Попробуйте отловить обращения к БД таким вот методом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DataAdapterName.RowUpdating += delegate(object senderDA, OleDbRowUpdatingEventArgs eDA)
{
                    string outputStr = "";
            if (eDA.Command != null)
                {
                    outputStr = String.Format("Command text: {0}\n", eDA.Command.CommandText);
                    outputStr += ("\nParameters:");
                    foreach (OleDbParameter p in eDA.Command.Parameters)
                    {
                        outputStr += String.Format("\n{0} - {1}", p.ParameterName, p.Value);
                    }
                }
            MessageBox.Show(outputStr);
};
0
10 / 10 / 7
Регистрация: 17.05.2009
Сообщений: 140
22.01.2014, 11:31  [ТС]
Ну как привязаны данные у меня выше в коде показано.
Запрос на выборку данных (упрощен, с целью показать какие столбцы приходят)
SQL
1
SELECT  `FAM`,  `NAME`,  `FATHER`, `ID`,  `CH` FROM plat
Я вот не пойму почему не работает вот этот код. Может я параметры не правильно заполнил?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
                da.UpdateCommand = new MySqlCommand("Update plat Set `CH` = @CH Where `ID`=@ID");
                da.UpdateCommand.Parameters.Add("@CH", MySqlDbType.Int16, 10, "CH");
                da.UpdateCommand.Parameters.Add("@ID", MySqlDbType.Int16, 10, "ID");
                MySqlConnection con = new MySqlConnection();
                con.ConnectionString = "Database=fixplat;Data Source=localhost;User Id=root1;Password=123456;charset=utf8;";
                con.Open();
                da.UpdateCommand.Connection = con;
                da.Update((DataSet)db.DataSource, "plat1");
                con.Close();
            
        }
Добавлено через 10 минут
Процесс привязки данных почти не изменился. Изменения только создал объект BindingSource, для того чтобы его потом адаптеру подсунуть. Почему не обновляются данные по коду выше?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[CSHARP]
            da.Fill(ds, "plat1");
            da1.Fill(ds, "pcalc");
 
            DataRelation dataRelation = new DataRelation("RNPFR1", ds.Tables["plat1"].Columns["RNPFR"], ds.Tables["pcalc"].Columns["RNPFR"]);
            ds.Relations.Add(dataRelation);
 
db = new BindingSource(ds, "plat1");
            dataGridView1.AutoGenerateColumns = false;
            dataGridView2.AutoGenerateColumns = false;
            
            dataGridView1.DataSource = db;
            dataGridView2.DataSource = new BindingSource(dataGridView1.DataSource, "RNPFR1");
 
            dataGridView1.Columns[0].DataPropertyName = "CH";
            //....
            dataGridView1.Columns[4].DataPropertyName = "FAM";
            dataGridView1.Columns[5].DataPropertyName = "NAME";
            dataGridView1.Columns[6].DataPropertyName = "FATHER";
            //....
           dataGridView1.Columns[15].DataPropertyName = "ID";
[/CSHARP]

Добавлено через 13 секунд
Процесс привязки данных почти не изменился. Изменения только создал объект BindingSource, для того чтобы его потом адаптеру подсунуть. Почему не обновляются данные по коду выше?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[CSHARP]
            da.Fill(ds, "plat1");
            da1.Fill(ds, "pcalc");
 
            DataRelation dataRelation = new DataRelation("RNPFR1", ds.Tables["plat1"].Columns["RNPFR"], ds.Tables["pcalc"].Columns["RNPFR"]);
            ds.Relations.Add(dataRelation);
 
db = new BindingSource(ds, "plat1");
            dataGridView1.AutoGenerateColumns = false;
            dataGridView2.AutoGenerateColumns = false;
            
            dataGridView1.DataSource = db;
            dataGridView2.DataSource = new BindingSource(dataGridView1.DataSource, "RNPFR1");
 
            dataGridView1.Columns[0].DataPropertyName = "CH";
            //....
            dataGridView1.Columns[4].DataPropertyName = "FAM";
            dataGridView1.Columns[5].DataPropertyName = "NAME";
            dataGridView1.Columns[6].DataPropertyName = "FATHER";
            //....
           dataGridView1.Columns[15].DataPropertyName = "ID";
[/CSHARP]

Добавлено через 8 минут
Я кажется понял почему не обновляются данные - производил изменения в ячейки и переходил на другую, чтобы сработало событие. Оно срабатывает, но данные не обновляются в этот момент. Если я изменяю еще один чек бокс и перехожу на ячейку, чтобы вызвать событие, то событие срабатывает и обновляется только предыдущее изменение. Т.е. если я сделаю, скажем, 3 изменения, то сохраняется всего 2 первых.

Как это исправить?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
22.01.2014, 11:39
Данный не обновляются потому, что событие CellValueChanged происходит до того, как эти изменения отправляются в источник данных. Можете отправить их принудительно. Так как вы используете BindingSource, то можете сделать так:
C#
1
2
3
4
5
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
               db.EndEdit();
               // Далее ваш код
}
1
Заблокирован
24.01.2014, 00:22
Посмотрите пример сохранения для OleDB (MSJET 4.0).
Может и под MySql + CellChanged получится переделать.
https://www.cyberforum.ru/ado-... ost5616558
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2014, 00:22
Помогаю со студенческими работами здесь

Как сохранить изменения в БД
Здравствуйте, ув. форумчане. Прочитал много тем про сохранение в бд access, смотрел видео, но везде (что видел) таблицу из бд привязывают...

Как сохранить изменения в БД
Помогите разобраться в сохранении БД. создаю программно доступ к БД по типу OleDbCommand myCommand = new...

Как сохранить изменения dataset в БД
Изменения сохраняются в dataset, а как сделать чтобы изменения сохранялись напрямую в БД? Нашел ответ на форуме, но не пойму где изменить...

Как сохранить изменения в таблице
Как сохранить изменения в таблице using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

Как сохранить изменения в таблице из DGV
Здраствуйте! Помогите пожалуста реализовать кнопку на редактирование данных в таблице. Это код на загрузку таблицы в DataGridView1 ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru