20 / 19 / 0
Регистрация: 04.04.2012
Сообщений: 31
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.NET 4.x Как передавать данные между формами06.04.2012, 05:44. Показов 65219. Ответов 4
Метки нет (Все метки)
Hi!
Написал по сабжу статью (первоначально - себе в блог), но решил выложить тут. Полезнее будет, может кому и пригодится. В процессе изучения C# вообще и WinForms в частности, у многих неофитов возникает вполне закономерный вопрос - а как передавать данные (в общем - объекты, но для начала хотя бы просто строки/числа). Кроме того, данные порой нужно передавать не только из основной формы в дочернюю, но и в обратном направлении. Для каждого из этих действий есть несколько способов реализации, и применение каждого из них зависит от контекста задачи, а также - от стиля и опыта программиста. Как правило, программисты выбирают себе несколько способов, которые используют в своих проектах. Я постарался в данной статье привести все известные мне способы, а так же их комбинации. Статья логически разделена на две части - прямая передача данных (из основной формы в дочернюю) и обратная. Задача 1: Передать текстовую строку из основной формы в дочернюю Реализация 1: Передать через конструктор дочерней формы Самый простой способ. Класс дочерней формы конструируется таким образом, чтобы конструктор (или одна из его перегрузок) класса принимал в качестве аргумента или аргументов некие данные. Способ удобен тем, что в дочернюю форму можно передать практически неограниченное количество данных фактически любого типа. Неудобен он тем, что класс дочерней формы в этом случае становится слишком узкоспециализированным. При разработке небольших проектов это не почувствуется, но если вы возьметесь за масштабное модульное бизнес-приложение, сразу поймете всю узкость данного подхода. Но, тем не менее, не рассмотреть его было бы несправедливо. Листинг 1.1.1. Основная форма:
Реализация 2: Передать через public-переменную или свойство класса дочерней формы. Способ чуть посложнее. Потребуется создать в классе дочерней формы дополнительную переменную или свойство (в данном случае - это не важно), и обработать событие Load дочерней формы. Листинг 1.2.1. Основная форма:
Суть способа в следующем: использовать для временного буфера свойство или переменную статического класса. Данный способ несколько более универсальный. Хотя бы тем, что он не требует специализации класса дочерней формы, т.е. нам не придется добавлять в класс дочерней формы дополнительные свойства или переменные. Только обработать событие Load формы. Листинг 1.3.1. Статический класс:
Не самый лучший вариант, попахивающий карри и индийскими слонами, но для полноты картины продемонстрирую и его. Суть способа в том, что в основной форме при обработке события Click на кнопке с помощью анонимного метода подписаться на событие Load дочерней формы и задать для этого события обработчик. А в обработчике уже производить присвоение свойству Text текстбокса дочерней формы каких-либо значений. Текстбоксу дочерней формы в этом случае должен быть присвоен модификатор public. Листинг 1.4.1 Основная форма:
Реализация 1. Через статический класс. Тут, в общем то, все достаточно просто и похоже на подобную реализацию выше. Но есть и пара нюансов. Поскольку по умолчанию основная форма "не знает", когда из дочерней в переменную статического класса будет записано значение, встает проблема - обновить текстбокс основной формы именно тогда, когда в статический класс будут внесены данные. В самом первом приближении это возможно при выполнении следующего условия - дочерняя форма открыта как диалог (т.е. управление передается на дочернюю форму при ее закрытии), а обновление текстбокса основной формы происходит после метода открытия дочерней формы. Листинг 2.1.1. Статический класс
При вызове дочерней формы мы можем с помощью анонимного метода подписаться на события вызываемой формы. Например, если мы подпишемся на событие закрытия окна, то сможем выполнить некие действия, когда дочерняя форма инициирует это событие (т.е. начнет закрываться). Листинг 2.2.1. Основная форма
Реализация 3. Через события статического класса. Опять задействуем посредника в виде статического класса. Однако применим на этот раз иной подход. В основной форме подпишемся на событие ValueChanged статического свойства DataBuffer. Но, поскольку свойство это "из коробки" не имеет подобных событий, его придется создать. Листинг 2.3.1. Статический класс
На данный момент вроде как все. Скорее всего что-то забыл, поэтому к критике в комментариях буду прислушиваться особенно внимательно. Best Regards, Aexx
6
|
06.04.2012, 05:44 | |
Ответы с готовыми решениями:
4
Как передать данные между формами Как передать данные между формами, без Show/ShowDialog Данные между формами передать данные между формами |
06.04.2012, 08:26 | 2 |
0
|
20 / 19 / 0
Регистрация: 04.04.2012
Сообщений: 31
|
|
06.04.2012, 08:28 [ТС] | 3 |
Хм, действительно. А слона то я и не приметил. Можно удалить тему, опубликую в блоге
0
|
11 / 11 / 1
Регистрация: 16.08.2011
Сообщений: 70
|
|
30.07.2012, 18:01 | 4 |
Здравствуйте !
А можно ли как-то решить эту задачу, если данными является массив (матрица) и размеры её определяются при работе программы? Сейчас ещё загляну в эти 7 вопросов, может там есть. - Однако, нет там этой проблемы. Вероятно, сделаю статический класс, а размеры матрицы - с запасом.
0
|
1 / 1 / 0
Регистрация: 18.11.2020
Сообщений: 6
|
|
16.06.2021, 12:09 | 5 |
0
|
16.06.2021, 12:09 | |
16.06.2021, 12:09 | |
Помогаю со студенческими работами здесь
5
Передавать числовые данные между двумя разными процессами Как передавать данные из одной формы в другую? как передавать данные из потока чтения в поток записи Как передавать данные из TextBox в ListBox из другой формы? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |