- Как передавать данные между формами
- Способы передачи данных между формами
- Спрашивающий
- Общие обсуждения
- Все ответы
- Передача данных между формами
- 3 ответа 3
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# или задайте свой вопрос.
- Связанные
- Похожие
- Подписаться на ленту
- Передача данных между формами
- Предварительные требования
- создание проекта Windows Forms приложения
- Создание источника данных
- Создание первой формы (Form1)
- Создание сетки с привязкой к данным на форме
- Создание второй формы
- Добавление запроса TableAdapter
- Создание метода на Form2 для передачи данных
- Создание метода на Form1 для передачи данных и показа Form2
- Запустите приложение
- Дальнейшие действия
Как передавать данные между формами
Hi!
Написал по сабжу статью (первоначально — себе в блог), но решил выложить тут. Полезнее будет, может кому и пригодится.
В процессе изучения C# вообще и WinForms в частности, у многих неофитов возникает вполне закономерный вопрос — а как передавать данные (в общем — объекты, но для начала хотя бы просто строки/числа). Кроме того, данные порой нужно передавать не только из основной формы в дочернюю, но и в обратном направлении. Для каждого из этих действий есть несколько способов реализации, и применение каждого из них зависит от контекста задачи, а также — от стиля и опыта программиста. Как правило, программисты выбирают себе несколько способов, которые используют в своих проектах. Я постарался в данной статье привести все известные мне способы, а так же их комбинации. Статья логически разделена на две части — прямая передача данных (из основной формы в дочернюю) и обратная.
Задача 1: Передать текстовую строку из основной формы в дочернюю
Реализация 1: Передать через конструктор дочерней формы
Самый простой способ. Класс дочерней формы конструируется таким образом, чтобы конструктор (или одна из его перегрузок) класса принимал в качестве аргумента или аргументов некие данные. Способ удобен тем, что в дочернюю форму можно передать практически неограниченное количество данных фактически любого типа. Неудобен он тем, что класс дочерней формы в этом случае становится слишком узкоспециализированным. При разработке небольших проектов это не почувствуется, но если вы возьметесь за масштабное модульное бизнес-приложение, сразу поймете всю узкость данного подхода. Но, тем не менее, не рассмотреть его было бы несправедливо.
Листинг 1.1.1. Основная форма:
Думаю, все понятно и без дальнейших комментариев 🙂
Реализация 2: Передать через public-переменную или свойство класса дочерней формы.
Способ чуть посложнее. Потребуется создать в классе дочерней формы дополнительную переменную или свойство (в данном случае — это не важно), и обработать событие Load дочерней формы.
Листинг 1.2.1. Основная форма:
Реализация 3: Передача данных через свойство/переменную статического класса.
Суть способа в следующем: использовать для временного буфера свойство или переменную статического класса. Данный способ несколько более универсальный. Хотя бы тем, что он не требует специализации класса дочерней формы, т.е. нам не придется добавлять в класс дочерней формы дополнительные свойства или переменные. Только обработать событие Load формы.
Листинг 1.3.1. Статический класс:
Реализация 2. Через событие закрытия окна.
При вызове дочерней формы мы можем с помощью анонимного метода подписаться на события вызываемой формы. Например, если мы подпишемся на событие закрытия окна, то сможем выполнить некие действия, когда дочерняя форма инициирует это событие (т.е. начнет закрываться).
Листинг 2.2.1. Основная форма
Кроме событий формы, можно подписаться на события любых public-компонентов. Но не рекомендую этого делать — это, конечно, легко и просто, но. некрасиво, что ли.
Реализация 3. Через события статического класса.
Опять задействуем посредника в виде статического класса. Однако применим на этот раз иной подход. В основной форме подпишемся на событие ValueChanged статического свойства DataBuffer. Но, поскольку свойство это «из коробки» не имеет подобных событий, его придется создать.
Листинг 2.3.1. Статический класс
Если открывать дочернюю форму как диалог, данные в основной форме обновятся после закрытия дочерней. В противном случае данные обновятся сразу же. Подобный подход удобен, когда нужно организовать одновременный обмен данными между двумя формами. Причем, в отличие от большинства других вариантов, такой способ обмена доступен и для равнозначных форм (запущенных от одного, не участвующего в обмене родителя — например, MDI-окна). Достаточно просто заставить каждую форму слушать определенное событие статического класса-буфера.
На данный момент вроде как все. Скорее всего что-то забыл, поэтому к критике в комментариях буду прислушиваться особенно внимательно.
Best Regards, Aexx
Источник
Способы передачи данных между формами
Спрашивающий
Общие обсуждения
Все ответы
Я обычно делаю свойство или публичный член класса формы. Но тогда надо передавать сам объект формы. Можно сделать сторонний Static Class для обмена данными.
Это корректно или обычно делают как-то иначе?
Один из способов передачи параметров между формами:
— в первой форме ( Form 1) объявить public переменную с модификатором static , например:
static public int i;
— задать значение ей, например при загрузке формы:
— во второй форме можно обратиться к переменной, например вывести значение переменной в заголовок формы:
this .Text = Form1 .i.ToString();
На мой взгляд использовать сторонний Static Class целесообразно для «долгого» хранения переменных.
Если необходимо единовременно передать данные между формами, то делаю следующее:
1.В форму куда необходимо передать данные (ФормаКуда) в коде пишем:
public partial class ФормаКуда: Form
<
ФормаОтКуда mainForm = null;
public Otsrochka(ФормаОтКуда main)
<
InitializeComponent();
mainForm = main;
>
2. Вызываем ФормаКуда из ФормаОтКуда:
ФормаКуда FormNew = new ФормаКуда (this);
FormNew .ShowDialog();
3. Манипулируем данными в ФормаКуда через mainForm. При этом необходимо чтобы переменные в ФормаОтКуда были Public
Источник
Передача данных между формами
Здравствуй ХэшКод, скажите у меня есть
На Form1 есть richTextBox1, и на Form2 есть richTextBox1, так вот хотелось бы сделать чтобы при нажатии на кнопку всё что есть в richTextBox1 на Form2 данные передавались в richTextBox1 на Form1. я попробовал изменить поле Modifer на Public, b таким кодом переместить данные
Но он почему-то не работает( Подскажите как передать данные между формами?
3 ответа 3
Всю необходимую форме (или любому объекту) информацию следует передавать в конструкторе:
UPD Также в классе Form есть свойсвто Owner , которому можно присвоить форму-владельца. В итоге дочерняя форма будет иметь доступ к родительской через это свойство.
Как вариант, можно использовать делегаты, и передавать данные через них.
В Form1 делаем richTextBox1 public. В ней же создаем экземпляр класса Form2
Далее, описываем метод:
Ну и собственно в Form2:
P.S. Этот вариант будет сразу же передавать весь текст в Form1, с кнопкой я думаю вы тоже разберетесь.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.11.18.40788
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Передача данных между формами
Это пошаговое руководство содержит инструкции по передаче данных из одной формы в другую. Используя таблицы Customers и Orders из Northwind, одна форма позволяет пользователям выбрать клиента, а вторая — заказы выбранного клиента. В этом пошаговом руководстве показано, как создать метод во второй форме, которая получает данные из первой формы.
Здесь демонстрируется всего один способ передачи данных между формами. Существуют и другие варианты передачи данных в форму, в том числе создание второго конструктора для получения данных или создание открытого свойства, которое можно задать с помощью данных из первой формы.
В данном пошаговом руководстве представлены следующие задачи.
создание нового проекта Windows Forms приложения .
Создание и настройка набора данных с помощью мастера настройки источника данных.
Выбор элемента управления, создаваемого на форме при перетаскивании элементов из окна Источники данных. Дополнительные сведения см. в разделе Установка элемента управления, создаваемого при перетаскивании из окна Источники данных.
Создание элемента управления с привязкой к данным с помощью перетаскивания элементов из окна Источники данных на форму.
Создание второй формы с сеткой для отображения данных.
Создание запроса адаптера таблицы для получения заказов определенного клиента.
Передача данных между формами.
Предварительные требования
в этом пошаговом руководстве используется SQL Server Express LocalDB и образец базы данных Northwind.
если у вас нет SQL Server Express LocalDB, установите его на странице загрузки SQL Server Expressили с помощью Visual Studio Installer. в Visual Studio Installer SQL Server Express LocalDB можно установить как часть рабочей нагрузки хранения и обработки данных или как отдельный компонент.
Установите учебную базу данных Northwind, выполнив следующие действия.
в Visual Studio откройте окно обозреватель объектов SQL Server . (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранения и обработки данных в Visual Studio Installer.) разверните узел SQL Server . щелкните правой кнопкой мыши экземпляр LocalDB и выберите создать запрос.
Откроется окно редактора запросов.
скопируйте скрипт Transact-SQL Northwind в буфер обмена. этот сценарий T-SQL создает базу данных Northwind с нуля и заполняет ее данными.
вставьте скрипт T-SQL в редактор запросов, а затем нажмите кнопку выполнить .
По истечении короткого времени выполнение запроса завершается и создается база данных Northwind.
создание проекта Windows Forms приложения
В Visual Studio в меню Файл выберите пункты Создать > Проект.
в левой области разверните элемент Visual C# или Visual Basic , а затем выберите Windows рабочий стол.
в средней области выберите тип проекта приложения Windows Forms .
Назовите проект пассингдатабетвинформс и нажмите кнопку ОК.
Создается проект PassingDataBetweenForms, который добавляется в Обозреватель решений.
Создание источника данных
Чтобы открыть окно Источники данных , в меню данные выберите команду отобразить источники данных.
В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.
На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.
На странице Выбор модели базы данных выберите Набор данных и нажмите кнопку Далее.
На странице Выбор подключения к данным выполните одно из следующих действий.
Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.
Выберите Новое подключение для открытия диалогового окна Добавить/изменить подключение.
Если базе данных требуется пароль и выбран параметр для включения конфиденциальных данных, выберите параметр и нажмите кнопку Далее.
На странице Сохранение подключения в файле конфигурации приложения нажмите кнопку Далее.
Разверните узел Таблицы на странице Выбор объектов базы данных.
Выберите таблицы Customers и Orders и нажмите кнопку Готово.
NorthwindDataSet добавляется в проект, и таблицы Customers и Orders отображаются в окне Источники данных.
Создание первой формы (Form1)
Вы можете создать сетку с привязкой к данным (элемент управления DataGridView) с помощью перетаскивания узла Customers из окна Источники данных на форму.
Создание сетки с привязкой к данным на форме
Перетащите главный узел Customers из окна Источники данных на форму Form1.
На форме Form1 появляется DataGridView и панель инструментов (BindingNavigator) для перемещения по записям. В области компонентов появляется NorthwindDataSet, CustomersTableAdapter, BindingSource и BindingNavigator.
Создание второй формы
Создайте вторую форму для передачи данных.
В меню Проект выберите пункт Добавить форму Windows.
Оставьте имя по умолчанию Form2 и нажмите кнопку Добавить.
Перетащите главный узел Orders из окна Источники данных на форму Form2.
На форме Form2 появляется DataGridView и панель инструментов (BindingNavigator) для перемещения по записям. В области компонентов появляется NorthwindDataSet, CustomersTableAdapter, BindingSource и BindingNavigator.
Удалите OrdersBindingNavigator из области компонентов.
OrdersBindingNavigator исчезает из Form2.
Добавление запроса TableAdapter
Добавление запроса TableAdapter в форму Form2 для загрузки заказов выбранного клиента на Form1.
Дважды щелкните файл NorthwindDataSet.xsd в обозревателе решений.
Щелкните правой кнопкой мыши элемент OrdersTableAdapter и выберите пункт Добавить запрос.
Оставьте параметр по умолчанию Использовать инструкции SQL и нажмите кнопку Далее.
Оставьте параметр по умолчанию Инструкция SELECT, возвращающая строки и нажмите кнопку Далее.
Добавьте в запрос предложение WHERE, чтобы возвратить Orders на основании CustomerID . Запрос должен выглядеть примерно следующим образом:
Проверьте правильность синтаксиса параметров для своей базы данных. Например, в Microsoft Access предложение WHERE должно выглядеть следующим образом: WHERE CustomerID = ? .
Щелкните Далее.
Для поля заполнить Дататаблемесод имя введите FillByCustomerID .
Снимите флажок Вернуть таблицу данных (DataTable) и нажмите кнопку Далее.
Нажмите кнопку Готово.
Создание метода на Form2 для передачи данных
Щелкните правой кнопкой мыши Form2 и выберите пункт Просмотреть код, чтобы открыть Form2 в редакторе кода.
Добавьте следующий код в Form2 после метода Form2_Load :
Создание метода на Form1 для передачи данных и показа Form2
В Form1 щелкните правой кнопкой мыши сетку данных клиентов и выберите пункт Свойства.
В окне Свойства выберите События.
Дважды щелкните событие CellDoubleClick.
Откроется окно редактора кода.
Обновите определение метода в соответствии со следующим примером:
Запустите приложение
Нажмите клавишу F5 для запуска приложения.
Дважды щелкните запись клиента в форме Form1, чтобы открыть Form2 с заказами этого клиента.
Дальнейшие действия
В зависимости от требований приложения существуют несколько шагов, которые, возможно, потребуется выполнить после передачи данных между формами. Ниже приводится перечень рекомендаций, позволяющих улучшить полученный результат.
Изменение набора данных для добавления или удаления объектов базы данных. Дополнительные сведения см. в разделе, посвященном созданию и настройке наборов данных.
Добавление функциональности для сохранения данных в базу данных. Дополнительные сведения см. в разделе Сохранение данных обратно в базу данных.
Источник