как передать данные с одной формы на другую c
Как передать данные с одной формы на другую c
Часто возникает необходимость передать определённые параметры между формами в одном приложении, например значения каких либо переменных, или запустить какую либо процедуру или функцию в другой форме. Здесь я расскажу о двух методах решения этой задачи. Описанные методы использую сам, поэтому и публикую. Первый метод попроще, второй посложнее но более универсальный и с большими возможностями.
Способ №1
Передача параметров, используя связь между формами. (этот метод назвал я так сам — может есть и научное название).
Здесь всё довольно просто. Предположим из главной формы мы запускаем другую форму, от которой впоследствии хотим получить какие либо данные, или желаем позволить вновь созданной форме выполнить какие либо действия с первой. То сделать мы это можем так:
В главной форме (родительской) запуск новой производим вот таким образом:
После такого действия в новой форме мы можем обращаться к элементам родительской формы, вот так:
Вот собственно и весь способ, можно им также передавать и просто переменные, но в случае когда надо связать не две формы а множество, или сложно проследить родство между формами, проще сделать вторым методом.
Способ №2
По событиям (Делегаты)
1. Создаём в основном namespace (это в файле program.cs) класс:
2. Далее добавляем в форму приёмник (их может быть и несколько — что очень удобно):
3. В форме источнике генерируем событие (там где это нам нужно).
Таким способом можно обмениваться данными между формами и запускать процедуры и функции в других формах, без всякой связи между самими формами. При этом можно заставить множество схожих форм выполнить одинаковые операции, что удобно.
Комментарии:
Большое спасибо автору статьи. В нете Это искал больше часа. Хоть кто-то человеческим языком объянил! (Специально зарегился чтобы спасибо сказать)
Два дня искал похожий пример. Я уж подумал пол интернета мусор пишут ерунду. Попробовав ваш пример и получилось и тут я и разтаял. Респект и уважуха admin.
А на С++ что-нибудь подобное делегатам реализуемо?
С C++ не помогу. Точно знаю что реализуемо. Но поскольку лично сам не пишу на нём, то детально не обрисую, что как делать. Если верить MSDN, не так уж и сложно.
Может вот это поможет: msdn.microsoft.com/ru-ru/library/system.delegate.aspx
Спасибо! тоже вчера искал искал и только здесь нашел вразумительное объяснение! СПАСИБО!
добрый день.
как-то совсем не получается первый способ,
компилятор ругается:
Error 3 ‘Databank_exp.MainForm.uid_main’ is inaccessible due to its protection level
В дочерней форме код такой:
MainForm g = (MainForm)this.Owner;
g.uid_main = «ла ла ла»;
Что это за защитный уровень, о котором говорит, компилятор и как это решить?
Если кто знает поделитесь, пожалуйста.
Переменная uid_main — public?
теперь да, исправил… спасибо
а во втором примере, если ругается в форме источнике на
CallBackMy.callbackEventHandler(«Передаваемые данные.»);
— Object reference not set to an instance of an object.
в чем может быть дело?
Без кода сложно сказать, но похоже на то что обработчик события не существует:
Ну и соответственно функция Reload — должна быть там, где обработчик события создаешь.
— Но это только предположение, код нужен чтобы точно сказать.
Управление одной формой из другой
Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма Form1, из нее мы открываем другую Form2 и теперь, работая в форме Form2 нужно обратиться, получить доступ к элементам родительской формы Form1. Я нашел несколько способов как это сделать.
1-й способ. Передача ссылки в public переменную.
Перед открытием формы, передаем ссылку на нужный элемент в переменную public вызываемой формы.
В форме Form2 переменная, в которую передавали ссылку, будет теперь соответствовать кнопке button1 из формы Form1
2-й способ. Передача ссылки в дочернюю форму.
Суть примерна та же, то и в 1-м способе. При открытии формы Form2 передаем в нее ссылку на элемент, который планируем потом менять.
Теперь в форме Form2 нужно создать переменную, которая будет содержать ссылку на эту кнопку и через нее будем обращаться к кнопке на Form1 (строки 5,7,9 и 15).
3-й способ. Доступ ко всей родительской форме.
Чтобы осуществить это, нужно внести изменения в нескольких файлах, но зато при этом получим доступ ко всем элементам родительской формы и не нужно передавать ссылку на каждый элемент, как в 1-м способе.
Шаг 1. В файле Program.cs создаем публичную переменную f1 (строка 5).
Шаг 3. При создании формы Form1 присваиваем переменной f1 ссылку на эту форму (строка 7)
Как передать данные между формами в C#
Pirnazar
Передача данных между формами в языке c#
В этой статье хочу показать один из возможных способов передачи данных между формами.
Передача данных между элементами формы
Задача будет следующая: на первой форме у нас будет элемент textbox, а на второй DataGridView и нам нужно будет сделать так, чтобы данные из одного элемента управления передавались в другой.
Создадим новое приложение типа Windows Forms Application. После чего добавим на первую форму два элемента управления: TextBox и Button.
В окне Solution Explorer добавим вторую форму.
Вторая форма
И так, для начала поработаем со второй формой.
Перейдите в окно ToolBox и добавьте на форму элемент управления DataGridView (dgv).
Добавление свойств
Для дальнейшей работы нам понадобиться создать три свойства:
Свойство DgvValue используется для получения и установки значения в ячейке элемента управления DataGridView.
Свойство DgvRowIndex — индекс строки в DataGridView.
Свойство DgvCellName — имя или название ячейки, в которую необходимо вставить значение из элемента textbox.
Добавление строк в DataGridView
Для данного примера мы создадим новый метод AddRowsToDgv, с помощью которого добавим в DataGridView две строки и два столбца (Name и Age).
О том, как добавить новую строку в DataGridView более подробно можно прочитать, перейдя по ссылке.
результат на картинке ниже
Передача значения в textBox
Из второй формы мы будем передать в элемент textBox выбранное нами значение ячейки в DataGridView. Передача будет происходить в момент закрытия второй формы.
Получить выбранное значение в элементе DataGridView можно разными способами, например с помощью события DataGridView_CellContentClick, которое возникает при клике на значении расположенном в ячейки.
Получение значения переданного из textbox
Теперь мы опишем часть, которая отвечает за получение данных из первой формы, то есть из элемента textbox.
Для начала подпишемся на событие Form2_Load.
В данном событии будет выполняться метод AddRowsToDgv, который создаст две строки в элементе DataGridView, а также здесь мы будем получать данные переданных из первой формы.
В качестве индекса строки и названия ячейки мы используем созданные нами свойства, чтобы на первой форме мы могли более точно определить, куда передать значение из элемента textbox.
Первая форма
Теперь поработаем с первой формой.
Данные из элемента textBox мы будем передавать во вторую форму, например при нажатии на кнопку, поэтому для начала подписываемся на событие Button_Click.
Установка значений свойств
Перед тем как передать данные во вторую форму установим значения для трёх свойств.
Событие FormClosed
Затем здесь же подписываемся на событие FormClosed. Сделаем мы это для того, чтобы, во-первых, отловить момент закрытия второй формы, а во-вторых, таким образом, мы сможем получить (на первой форме) переданное значение, которое затем установим в textbox.
Открытие второй формы
И последнее что нам осталось сделать, так это отобразить или открыть вторую форму. Сделать это можно с помощью метода Showлибо ShowDialog.
Теперь если запустить наше предложение и нажать на кнопку, расположенную на первой форме, то данные из textbox будут переданы во вторую форму в элемент DataGridView.
Чтобы передать данные из второй формы нам нужно сначала выбрать значение в DataGridView, а затем просто закрыть форму. Либо можно, например, добавить на форму кнопку и передать данные с помощью неё.
Передача данных из одной формы в другую
Передача данных с одной формы в другую
как сделать чтобы в visual при введении числа и нажатии кнопки в одной форме результат (это число в.
Передача данных из одной формы в другую
Привет! Может сможет кто-то помочь, нужно по заданию сделать ограничение на длину пароля.
Передача данных из одной формы в другую
Всем привет. Как правильно организовать передачу данных из одной программы в другую? class.
Передача данных из одной формы в другую
Подскажите как передать данные из одной формы в другую например: у меня во второй форме вводится.
Вложения
WinForms_Clients.zip (32.6 Кб, 47 просмотров) |
Вот улучшил немного. Можно редактировать, удалять элементы в списке. Ну и при повторной попытке создать окно отображающее список клиентов, просто на него перейдёт фокус.
Если есть что критиковать (тем кто в теме и возможно знает, как сделать лучше), послушал бы мнение (ну может я что-то не так сделал). Вот лично я сам думаю, что можно немного лучше сделать. Написать менеджер клиентов, написать у него события, по событиям уже обновлять окно со списком контактов например. Немного с редактированием не ясно, но в ходе написания что-нибудь придумалось бы. И вообще работать полностью с менеджером, который бы инкапсулировал в себе коллекцию клиентов и не давал бы к ней открытый доступ. А то в данной реализации надо контролировать, чтобы при удалении из ListView, из коллекции тоже удалялись элементы.
Вложения
WinForms_Clients.zip (35.0 Кб, 48 просмотров) |
Вот улучшил немного. Можно редактировать, удалять элементы в списке. Ну и при повторной попытке создать окно отображающее список клиентов, просто на него перейдёт фокус.
как использувать переменные одной формы в другой?
1 ответ 1
Для начала, давайте поговорим о переменных, полях, методах и др.
Допустим у нас есть некий класс:
Теперь давайте сделаем вызов всего этого:
Можно заметить, что после инициализации нашего класса ( new. ) мы без труда можем работать со всеми публичными полями и методами, которые заданы в корне данного класса.
На консоль тем временем выведится:
Теперь предположим у нас есть в неком классе метод:
Вопрос: А сможем ли мы получить доступ MyField из других классов, методов и др.?
Ответ: Нет. Это локальное поле с которым может работать только данный метод!
Теперь поговорим о передаче значений между классами:
Создадим еще один класс, он должен уметь работать со всем, что есть у нашего MainClass :
Давайте перепишем немного вызов всего этого:
Мы инициализируем сначала наш основной класс (MainClass), затем инициализируем второй класс (MySecondClass) в который передаем ссылку на основной класс, задаем в основном классе публичному полю значение и вызываем уже из второго (а не из первого как раньше) класса наш метод Read. Результатом будет тот же текст.
Ну вроде все, надеюсь я помог вам этим «ликбезом», растолковал о доступности методов или полей, а также с правильной передачей значений между классами. Удачи в изучение C#!