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

После редактирования данных в БД, данные на форме обновляются только после перезапуска программы

06.03.2018, 16:27. Показов 5455. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Прошу помощи.

Пишу программу Form1 работает с полями из БД MS Sql LocalDB, Form2 - отчет, содержащий данные с Form1, Form3 - форма для редактирования БД.

Проблема в том, что после редактирования БД через Form3, данные в полях Form1 обновляются только после перезапуска программы.

На Form3 данные редактируются в dataGridView1

Добавление в dataGridView1, потом по нажатию на кнопку происходит сохранение изменений

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
if (OtdelRadioButton.Checked == true)
            {
                try
                {
                    dataGridView1.DataSource = akt_DBDataSet.Otdel;
 
                    otdelTableAdapter.Update(akt_DBDataSet);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка");
                }
            }
Удаление так

C#
1
2
3
4
5
6
7
8
if (OtdelRadioButton.Checked == true)
            {
                //В буфернуб таблицу записывается текущая запись из DataGrid
                CurrencyManager CurMan = (CurrencyManager)dataGridView1.BindingContext[dataGridView1.DataSource];
                if (CurMan.Count > 0) //если таблица не пустая
                    CurMan.RemoveAt(CurMan.Position); // удаляется отмеченная позиция
                otdelTableAdapter.Update(akt_DBDataSet);
            }
в гриде сразу видны изменения, а вот на Form1 изменения только после перезапуска

Form3 вызывается из Form1

Помогите пожалуйста.

Заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2018, 16:27
Ответы с готовыми решениями:

Angular datatables dtOptions и данные обновляются только после второго нажатия кнопки
Добрый день. Хочу сделать rerender таблицы angular-datatables <button type="button" class="btn btn-success m-r-sm"...

Сохранение данных в Listbox после перезапуска программы
Можно ли это сделать, не создавая дополнительных текстовых файлов? Если можно только используя текстовый файл, то как практичнее это...

Не сохраняются данные после перезапуска
Всем привет! Прошу помощи, понимаю что тема уже заезжена, но не могу разобраться: 1) запускаю программу ввожу в таблицу данные,...

14
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
06.03.2018, 16:48
Цитата Сообщение от Oskolok_Lda Посмотреть сообщение
Form3 вызывается из Form1
После обновления данных в Form3 нужно сразу же перечитывать таблицу в Form1.

Не по теме:

ууух - как же напрягают вот такие названия в проектах :D

1
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
06.03.2018, 16:52  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
После обновления данных в Form3 нужно сразу же перечитывать таблицу в Form1.
Подскажите как это сделать?
В Form1_Load есть строчка this.otdelTableAdapter.Fill(this.akt_DBD ataSet.Otdel);
При закрытии Form3 вызывается Form1. Разве в этот момент не происходит перечитывание?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
06.03.2018, 17:38
Oskolok_Lda, ну... поставьте точку останова в методах update и fill - и узнаете - запускаются ли и в какой последовательности
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
06.03.2018, 17:47  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
поставьте точку останова в методах update и fill - и узнаете - запускаются ли и в какой последовательности
Ну да в той последовательности, в которой я думал, не выполняются. Может ткнете меня. Никак не могу сообразить как в Form3 вызвать обновление адаптера из Form1?
Я, честно говоря, первый раз на Visual пишу. Учусь так сказать...
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
06.03.2018, 22:23
Создать делегат общий для неймспейса, в него поместить метод обновления из 1-ой формы, и передать этот делегат как параметр в 3-ью форму, и заинвочить там в нужный момент.
Ну это самое первое, что в голову пришло. Скорее всего есть более красивое решение, но не на ночь
0
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 9
07.03.2018, 04:46
Oskolok_Lda, я делал так: новую форму открывал в showDialog и сразу после этого перезагружал данные.


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
30
31
32
33
34
            FormAddModel test = new FormAddModel();
            test.ShowDialog(); 
            string sql = "select * from  model_tab where id_model=max(id_model)";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
                DataTable ds = new DataTable();
                //DataSet dk = new DataSet();
                adapter.Fill(ds);
                if (ds.Rows.Count>0 && ds.Rows.Count> dz.Rows.Count)
                { 
                    ListViewItem lvi = new ListViewItem(ds.Rows[ds.Rows.Count - 1]["name"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["metod_type"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["Date_Create"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["koeff1"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["koeff2"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["koeff3"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["koeff4"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["e_k"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["a"].ToString());
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["b"].ToString());
                    /*if (dr["id_scan"].ToString() != "") lvi.SubItems.Add("Сканирование");
                    else if (dr["id_gold"].ToString() != "") lvi.SubItems.Add("Золотое Сечение");
                    else lvi.SubItems.Add("Обратный реверсивный");*/
                    lvi.SubItems.Add(ds.Rows[ds.Rows.Count - 1]["id_model"].ToString());
                    listViewModel.Items.Add(lvi);
                listViewModel.Focus();
                listViewModel.Items[listViewModel.Items.Count - 1].Selected = true;
                listViewModel.Items[listViewModel.Items.Count - 1].Focused = true;
                    listViewCalc.Items.Clear();
                    listViewModel_ItemSelectionChanged(null, null);
                }
            }
Добавлено через 14 минут
Дело в том, что после ShowDialog выполнение приостанавливается пока не закроется форма, открытая в диалоговом режиме, что очень удобно (не надо отправлять ссылки или ещё какие-либо костыли делать). Я у себя работал только через запросы и выгружал данные в listview. У тебя всё проще - после ShowDialog перезагрузить данные в DataGrid.
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
07.03.2018, 09:31  [ТС]
Цитата Сообщение от Niorsan Посмотреть сообщение
Дело в том, что после ShowDialog выполнение приостанавливается пока не закроется форма, открытая в диалоговом режиме, что очень удобно (не надо отправлять ссылки или ещё какие-либо костыли делать). Я у себя работал только через запросы и выгружал данные в listview. У тебя всё проще - после ShowDialog перезагрузить данные в DataGrid.
У меня формы вызываются через Form.Show. А данные мне нужно обновить не в DataGrid, а в ComboBox и TextBox на Form1. Редактирование происходит в DataGrid на Form3. Там изменения я вижу сразу. А на Form1 не в ComboBox'ax и TextBox'ax не обновляются

Попробовал вызов через ShowDialog - ничего не изменилось. Видимо потому что Form1 вызывает Form3, а не наоборот

Добавлено через 7 минут
Цитата Сообщение от hoolygan Посмотреть сообщение
Создать делегат общий для неймспейса, в него поместить метод обновления из 1-ой формы, и передать этот делегат как параметр в 3-ью форму, и заинвочить там в нужный момент.
Ну это самое первое, что в голову пришло. Скорее всего есть более красивое решение, но не на ночь
Для первой программы в Visual Studio все очень понятно, даже на ночь

Добавлено через 23 минуты
Можно ли как-то вызвать из Form3 TableAdapter, находящийся на Form1, и обновить его (типа Form1.otdelTableAdapter.Fill(akt_DBDataS et.Otdel) или Form1.otdelTableAdapter.Update(akt_DBDat aSet) или Form1.OtdelComboBox.Fill) ?
Я раньше в Delphi писал немного, там можно было обратиться к элементам с другой формы. Думаю, что и тут можно, только не знаю как...
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
07.03.2018, 09:56
Oskolok_Lda, как передавать данные между формами можно почитать здесь: Ответы на 7 самых частых вопросов по WinForms
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
07.03.2018, 09:57
Цитата Сообщение от Oskolok_Lda Посмотреть сообщение
формы вызываются через Form.Show
А если открыть тогда 5 штук форм для изменений - то какая из них правильная? - Видимо кто последний - тот и прав - но насколько это удобно?
Цитата Сообщение от Oskolok_Lda Посмотреть сообщение
там можно было обратиться к элементам с другой формы. Думаю, что и тут можно, только не знаю как
Можно - но вот лучше не знать как - тогда и костылей будет меньше. Не нужно давать всяким другим формам/классам право обращаться к элементам формы - Вы же не даете право всем ковыряться у Вас в носу?
Хотя - в Вашем конкретно случае - я бы вынес всю модель в отдельный класс. И создал бы биндинг, а в моделе бы организовал реализацию интерфейса INotifyPropertyChanged.
Тогда проблема обновления данных во всех/любых связанных формах решилась бы сама собой.
Но буду откровенен - я так и не понял жизненного цикла программы - что и как должно отработать - поэтому это всё только догадки сейчас.
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
07.03.2018, 14:51  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Но буду откровенен - я так и не понял жизненного цикла программы - что и как должно отработать - поэтому это всё только догадки сейчас.
Form1 используется для выбора определенных полей из БД (ComboBox, TextBox). На основании указанных данных в Form2 выводится отчет для печати. А Form3 для редактирования БД, добавление или изменение данных. Все банально просто

Добавлено через 22 минуты
Цитата Сообщение от Igr_ok Посмотреть сообщение
можно почитать здесь: Ответы на 7 самых частых вопросов по WinForms
Спасибо почитаю

Добавлено через 4 часа 22 минуты
Почитал. Решил взять за основу этот способ
2.5 Используем свойство 'родитель'
При создании второй формы устанавливаем владельца

C#
1
2
3
Form2 f = new Form2();
f.Owner = this;
f.ShowDialog();
Во второй форме определяем владельца
C#
1
2
3
4
5
6
Form1 main = this.Owner as Form1;
if(main != null)
{
    string s = main.textBox1.Text;
    main.textBox1.Text = "OK";
}
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП

Но он не позволяет сделать обновление адаптера, только передачу данных через присвоение

Помогите пожалуйста примером. Программа готова остался только этот нюанс с обновлением данных
0
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 9
07.03.2018, 18:07
Oskolok_Lda, тут необязательно так поступать. Вроде бы в TableAdapter старые данные остались, поэтому и не меняется ничего (могу и ошибаться). Когда я только начинал с базой работать, я вроде бы с похожей вещью сталкивался. Если привязываешь через конструктор формы - то на событие Form_Load() создаётся какая-то привязка (не помню что там BindingSource или что). Так вот я вроде бы вызывал это событие вручную при каждом чихе программы (знаю, что костыль), чтобы на всякий случай данные старые не подхватить (или заново загружал TableAdapter или BindingSource). Ну и у меня что-то ещё было, кроме TableAdapter и BindingSource (года 3 назад так работал, уже забыл).

Добавлено через 20 минут
Сохранял я вроде так: ....BindingSource.EndEdit();
this.Garanty.TableAdapter.Update(this.My BD_DBDataSet.Garanty);
А чтобы прочитать актуальные данные я вроде бы заполнял TableAdapter (туда вроде бы таблица из DataSet отправляется)
В моём проекте тогда было 14 форм и 6 отчётов. Местами тупило, но нормально всё работало.
Может я что-то упустил.

Добавлено через 16 минут
Да и смысл обновлять TableAdapter, находящийся в одной форме через другую? Ведь TableAdapter связан с базой, а база едина для всего проекта.
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
07.03.2018, 21:02  [ТС]
Цитата Сообщение от Niorsan Посмотреть сообщение
Да и смысл обновлять TableAdapter, находящийся в одной форме через другую? Ведь TableAdapter связан с базой, а база едина для всего проекта
Согласен, но я не сильно знаком с C#, Это мой первый проект, и так, чисто для себя, поэтому не могу понять как обновить.

Цитата Сообщение от Niorsan Посмотреть сообщение
Вроде бы в TableAdapter старые данные остались, поэтому и не меняется ничего (могу и ошибаться)
Я специально делал изменения, они сохраняются, но только на той форме, где произошло редактирование. А после перезапуска проги, изменения видны в общей базе
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
12.03.2018, 11:30  [ТС]
Отвечу сам себе. Поставил на событие Form1_Activated обновление нужного адаптера, точнее не обновление, а подгрузку данных из базы. Вот так вообщем otdelTableAdapter.Fill(akt_DBDataSet.Otd el).
Результат достигнут))
0
2 / 2 / 0
Регистрация: 29.01.2009
Сообщений: 67
14.03.2018, 13:54  [ТС]
Цитата Сообщение от Oskolok_Lda Посмотреть сообщение
Поставил на событие Form1_Activated
Не много не удобно, т.к. каждый раз при смене активного окна данные в полях на форме сбрасываются на дефолтные. На какое еще событие в первой форме можно поставить otdelTableAdapter.Fill(akt_DBDataSet.Otd el)? Или какое событие происходит формой один если скрывается она и открывается другая
C#
1
2
3
4
 Form Form3 = new Form3();
            Form3.Show(); // отображаем Form3
            this.Hide(); // скрываем Form1 (this - текущая форма)
            //Form3.ShowDialog();
А закрывается форма 3 и возвращается форма 1 так:
C#
1
2
3
// вызываем главную форму приложения, которая открыла текущую форму Form3, главная форма всегда = 0
            Form Form1 = Application.OpenForms[0];
            Form1.Show();
Пробовал ставит на Form1_Shown, но не помогло. Это событие не происходит при открытии формы

Добавлено через 1 час 41 минуту
Цитата Сообщение от Oskolok_Lda Посмотреть сообщение
Пробовал ставит на Form1_Shown, но не помогло. Это событие не происходит при открытии формы
Поставил на Form1_VisibleChanged.
Результат достигнут
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2018, 13:54
Помогаю со студенческими работами здесь

Таблица обновляется только после перезапуска
Заполняю БД, но таблица обновляется только после перезапуска. Ещё нужно очистить textbox"ы после ввода данных.

DataGridView обновляется только после перезапуска формы
В базу добавляется, но dataGridView обновляется только после перезапуска формы. как исправить? private void button2_Click(object...

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

Органайзер обновляется только после перезапуска приложения
Вот пытаюсь сделать свой органайзер, но что то не идет, все повисло на обновлении списка. Обновляется только после перезапуска...

Intelij Idea отображает изменения только после перезапуска
Утро доброе, скачал маленький репозиторий http://github.com/ccordenier/tapestry5-hotel-booking/ Запускаю его через среду Intelij Idea...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru