|
20 / 19 / 0
Регистрация: 04.04.2012
Сообщений: 31
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.NET 4.x Как передавать данные между формами06.04.2012, 05:44. Показов 70266. Ответов 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 | |
|
0
|
|
|
20 / 19 / 0
Регистрация: 04.04.2012
Сообщений: 31
|
|
| 06.04.2012, 08:28 [ТС] | |
|
Хм, действительно. А слона то я и не приметил. Можно удалить тему, опубликую в блоге
0
|
|
|
11 / 11 / 1
Регистрация: 16.08.2011
Сообщений: 70
|
|
| 30.07.2012, 18:01 | |
|
Здравствуйте !
А можно ли как-то решить эту задачу, если данными является массив (матрица) и размеры её определяются при работе программы? Сейчас ещё загляну в эти 7 вопросов, может там есть. - Однако, нет там этой проблемы. Вероятно, сделаю статический класс, а размеры матрицы - с запасом.
0
|
|
|
1 / 1 / 0
Регистрация: 18.11.2020
Сообщений: 6
|
|
| 16.06.2021, 12:09 | |
|
0
|
|
| 16.06.2021, 12:09 | |
|
Помогаю со студенческими работами здесь
5
передать данные между формами Передавать числовые данные между двумя разными процессами Как передавать данные из одной формы в другую?
Как передавать данные из TextBox в ListBox из другой формы? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|