Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
1

Манипулирование данными между формами

14.07.2009, 14:55. Просмотров 4719. Ответов 14
Метки нет (Все метки)

Всем привет!

Возникла проблема при манипулировании данными между двумя формами.

Кто как реализует сохранение изменений в DataSet дочерней формы?
Т.е., предположим у нас 2 формы. 1 - главная, вторая подчиненная. Как грамотней и лучше реализовать передачу управления DataSet-ом между этими формами..

Я делаю так:
На главной форме объявляю DataSet и DataAdapter статическими:

C#
1
2
public static DataSet ds;
public static OleDbDataAdapter da;
Далее при переходе на вторую форму, просто создаю её экземпляр:
C#
1
2
Form2 frm2 = new Form2();
frm2.Show();
На дочерней форме редактирование (или добавление, не важно), делаю примерно таким образом:
C#
1
2
3
4
5
6
7
8
DataRow r = Form1.ds.Tables["patient"].NewRow();
r["id_patient"] = 0;
r["surname"] = textBox1.Text;
//<и т.д.>
//...
Form1.ds.Tables["patient"].Rows.Add(r);
Form1.da.Update(Form1.ds, "patient");
Close();
Данные при таком варианте фактически в таблицу попадают, но DataGridView на дочерней форме не обновляется...

Кто подскажет как реализовать это взаимодействие правильно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2009, 14:55
Ответы с готовыми решениями:

Обмен данными между формами
Задача следующая. Нужно чтобы в форме Form2 был доступ к данным, созданным в классе stroka из формы...

Обмен данными между формами
форма родитель имеет кнопку, при нажатии на которую создаётся ребёнок. у ребёнка есть picturebox и...

Обмен данными между формами
Всем привет Имеется 2 открытые формы, необходимо при клике передать данный с 2 формы на 1, без...

Обмен данными между формами
Есть две формы , допустим Form1 и Form2. В Form1 есть класс MyClass1, объект которого создается там...

Обмен данными между формами
Работаю в Visual Studio 2008, приложение Windows Forms. Есть две формы (Form1 и Form2). На Form2...

14
Sergei
1463 / 730 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
14.07.2009, 15:02 2
Лучше использовать открытые свойства. в классе дочерней формы создайте необходимые публичные свойства
и при создании объекта этой формы перед ее показом передавайте даные через эти свойства
я считаю так будет правильнее с точки зрения ООП
1
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
14.07.2009, 15:12  [ТС] 3
Цитата Сообщение от Sergei Посмотреть сообщение
Лучше использовать открытые свойства.
Поподробнее можно?

Добавлено через 7 минут 19 секунд
Цитата Сообщение от Sergei Посмотреть сообщение
в классе дочерней формы создайте необходимые публичные свойства
и при создании объекта этой формы перед ее показом передавайте даные через эти свойства
Не знаю, как там на счет свойств, но передать в качестве параметра можно:

Дочерняя форма:
C#
1
2
3
4
5
6
public void get_params(MySqlConnection c, DataSet d_s, DataAdapter d_a)
{
    conn = c;
    ds=d_s;
    da=d_a;
}
Главная форма:
C#
1
2
3
Form2 frm2 = new Form2();
frm2.get_params(conn,ds,da);
frm2.ShowDialog();
...однако, так не решается проблема обновления DataGridView на главной форме...
0
Sergei
1463 / 730 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
14.07.2009, 15:22 4
В дочерней форме можно реализовать свойства так
C#
1
2
3
4
5
6
7
8
 private DataSet ds = new DataSet();
public DataSetForm
{
     get {return ds;}
     set {ds = value;}
}
//Далее при загрузке формы 2 можно связать ds c DataGridView на этой форме.
datagridview.DataSource = ds.Tables[0];
C#
1
2
3
Form2 frm2 = new Form2();
frm2.DataSetForm = dsForm1;
frm2.ShowDialog();
Если не понятно спрашивайте.
1
14.07.2009, 15:22
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
14.07.2009, 15:59  [ТС] 5
Фух... кое-как перенес это все на учебный пример... Заработало. Спасибо!

Только вот, в автоикрементируемом поле, почему-то сразу не отображаются изменения в DataGridView родительской формы... Ну это ничего, потому что я его все равно отображать не собираюсь...

Спасибо огромное за ответы!!!
0
Sergei
1463 / 730 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
14.07.2009, 18:04 6
Я знаю что не отображается сразу но если поле автоинкриментируемое, то например при вставке новой записи в таблицу его не надо добавлять оно само добавляется и потом отображается в DataGridView. Что бы изменения сразцу отображались надо делать все в дизайнере и использованием bindingSources
1
Green
1920 / 425 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
15.07.2009, 03:01 7
Цитата Сообщение от Sergei Посмотреть сообщение
Что бы изменения сразцу отображались надо делать все в дизайнере и использованием bindingSources
BindingSource нужен, а вот дизайнер совсем не обязателен.
1
Sergei
1463 / 730 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
15.07.2009, 09:46 8
Это понятно но новичку с дизайнером легче разобраться.
0
kvest
10 / 10 / 2
Регистрация: 17.07.2009
Сообщений: 72
22.07.2009, 18:08 9
Цитата Сообщение от Sergei Посмотреть сообщение
Что бы изменения сразцу отображались надо делать все в дизайнере и использованием bindingSources
ну или как вариант передать в конструктор другой формы ссылку на объект, который должен изменяться в реальном времени, и там с ним работать
0
Green
1920 / 425 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
23.07.2009, 03:28 10
Цитата Сообщение от kvest Посмотреть сообщение
ну или как вариант передать в конструктор другой формы ссылку на объект, который должен изменяться в реальном времени, и там с ним работать
Какая то сумбурная мысль. Что подразумевается под "и там с ним работать"?
В чем вы видите разницу между обращением к статической переменной и передачей ссылки на эту переменную в данном контексте?
Речь идет не о том как работать с данными, а как во время отреагировать в одной форме на изменение данных в другой форме.
0
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
23.07.2009, 08:51  [ТС] 11
тут попутный вопрос возник. В дочернюю форму нужно передавать только BindingSource, если он связан с DataSet или DataSet нужно передавать?
0
kvest
10 / 10 / 2
Регистрация: 17.07.2009
Сообщений: 72
23.07.2009, 11:43 12
Цитата Сообщение от Green Посмотреть сообщение
Какая то сумбурная мысль. Что подразумевается под "и там с ним работать"?
В чем вы видите разницу между обращением к статической переменной и передачей ссылки на эту переменную в данном контексте?
Речь идет не о том как работать с данными, а как во время отреагировать в одной форме на изменение данных в другой форме.
Разница в том что к статической переменной обращаться прийдется через ту форму, да и статики как элементы формы использовать имхо глупо. Но самый лучший вариант отреагировать в одной форме на изменение данных в другой форме это передать метод форме (правда она должна в конструкторе ожидать делегат с такой же сигнатурой) на которой объект будет изменяться. Примерно так:

Код
class MainForm
{
ChildForm c;
...
private void ApplyChanges()
{
...
//применение изменений на эту форму
...
}
...
private void buttonNewFormCreate(...)
{
...
c = new ChildForm(ApplyChanges);
c.Show();
...
}

...
}

class ChildForm
{
private delegate void p();
p a;
....
ChildForm (p method)
{
a = method;
}
...
someEventOrMethod()
{
a(); //В этот момент и будем рефрешить отображаемую инфу
}
...
}
В таком случае по выполнению someEventOrMethod() изменения объекта с формы ChildForm будут передаваться форме MainForm, которая ее породила.
0
Green
1920 / 425 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
24.07.2009, 04:21 13
Цитата Сообщение от davian Посмотреть сообщение
тут попутный вопрос возник. В дочернюю форму нужно передавать только BindingSource, если он связан с DataSet или DataSet нужно передавать?
Достаточно BindingSource.

Цитата Сообщение от kvest Посмотреть сообщение
Но самый лучший вариант отреагировать в одной форме на изменение данных в другой форме это передать метод форме (правда она должна в конструкторе ожидать делегат с такой же сигнатурой) на которой объект будет изменяться. Примерно так:
Примерно так, но у .NET идеология событий.
Примерно так и работает BindingSource, он подписывается на события изменения источника и предоставляет своим приемникам уведомления об изменении состояния.
0
kvest
10 / 10 / 2
Регистрация: 17.07.2009
Сообщений: 72
24.07.2009, 10:53 14
Цитата Сообщение от Green Посмотреть сообщение
Примерно так, но у .NET идеология событий.
Примерно так и работает BindingSource, он подписывается на события изменения источника и предоставляет своим приемникам уведомления об изменении состояния.
Никогда не работал с этим . Можешь посоветовать где почитать про BindingSource?
0
Green
1920 / 425 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
25.07.2009, 12:42 15
В MSDN есть набор статей по работе с BindingSource.

Brian Noyes "Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET".
0
25.07.2009, 12:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2009, 12:42

Обмен данными между формами
Здравствуйте! Пишу в VS 2012. Есть две формы, по выборе чекбокса открывается вторая форма. Во...

Обмен данными между формами в MDI
есть форма перент - Form1 она создала 2 формы child: Form2, Form3. соответственно в Form1 они...

Обмен данными между двумя формами
У меня есть две формы и нужно передать данные от одной формы к другой. Вот код: /* Форма 1 */...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru