Передача параметров между формами в C#
Язык программирования C#Часто возникает необходимость передать определённые параметры между формами в одном приложении, например значения каких либо переменных, или запустить какую либо процедуру или функцию в другой форме. Здесь я расскажу о двух методах решения этой задачи. Описанные методы использую сам, поэтому и публикую. Первый метод попроще, второй посложнее но более универсальный и с большими возможностями.
Способ №1
Передача параметров, используя связь между формами. (этот метод назвал я так сам — может есть и научное название).
Здесь всё довольно просто. Предположим из главной формы мы запускаем другую форму, от которой впоследствии хотим получить какие либо данные, или желаем позволить вновь созданной форме выполнить какие либо действия с первой. То сделать мы это можем так:
В главной форме (родительской) запуск новой производим вот таким образом:
FormNew frm = new FormNew();
frm.Owner = this; //Передаём вновь созданной форме её владельца.
frm.Show();
После такого действия в новой форме мы можем обращаться к элементам родительской формы, вот так:
FormMain frm = (FormMain)this.Owner;
frm.MyFunc(); //MyFunc - это ваша функция основной формы.
Вот собственно и весь способ, можно им также передавать и просто переменные, но в случае когда надо связать не две формы а множество, или сложно проследить родство между формами, проще сделать вторым методом.
Способ №2
По событиям (Делегаты)
1. Создаём в основном namespace (это в файле program.cs) класс:
public static class CallBackMy
{
public delegate void callbackEvent(string what);
public static callbackEvent callbackEventHandler;
}
2. Далее добавляем в форму приёмник (их может быть и несколько — что очень удобно):
public FormMy()
{
// Добавляем обработчик события - который запустит функцию Reload
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.Reload);
InitializeComponent();
}
void Reload(string param)
{
//Здесь чего нибудь делаем.
//Это непосредственно то что выполнится по событию.
}
3. В форме источнике генерируем событие (там где это нам нужно).
CallBackMy.callbackEventHandler("Передаваемые данные.");
Таким способом можно обмениваться данными между формами и запускать процедуры и функции в других формах, без всякой связи между самими формами. При этом можно заставить множество схожих форм выполнить одинаковые операции, что удобно.
Большое спасибо автору статьи. В нете Это искал больше часа. Хоть кто-то человеческим языком объянил! (Специально зарегился чтобы спасибо сказать)
ОтветитьДва дня искал похожий пример. Я уж подумал пол интернета мусор пишут ерунду. Попробовав ваш пример и получилось и тут я и разтаял. Респект и уважуха 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.
в чем может быть дело?
Без кода сложно сказать, но похоже на то что обработчик события не существует:
CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.Reload);
Ну и соответственно функция Reload — должна быть там, где обработчик события создаешь.
— Но это только предположение, код нужен чтобы точно сказать. Ответить
Статья действительно хорошая, неплохо бы расширить примерами с использованием заполнения форм сожержащих Datagridview.
ОтветитьНу, по программному заполнению DataGridView есть парочка публикаций:
http://kbss.ru/blog/lang_c_sharp/23.html
http://kbss.ru/blog/lang_c_sharp/38.html
Думаю увязать одно с другим не сложно.
Работа с Postgresql в C#
Не так давно занялся разработкой приложения на C# работающего на базе PostreSQL, появилась информаци (читать далее...)
1098Работа с MySQL в C#
Надеюсь данная публикация не даст читателям повторить мои ошибки и поможет сделать изначально правил (читать далее...)
648OpenXML - Пример создания Excel файла на C#
В данной публикации приведен пример генерации Excel файла при помощи библиотеки OpenXML. Отличие это (читать далее...)
438Чтение данных из таблиц Excel
Многие материалы которые я здесь описываю, я размещаю для самого себя, в основном чтобы мучительно д (читать далее...)
250Сортировка списка (List) в C#
На днях понадобилось сортировать списки, удивительно, на сколько это оказалось просто. Допустим, име (читать далее...)
210
Комментарии: