Передача параметров между формами в 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("Передаваемые данные.");


Таким способом можно обмениваться данными между формами и запускать процедуры и функции в других формах, без всякой связи между самими формами. При этом можно заставить множество схожих форм выполнить одинаковые операции, что удобно.

C шарп программирование Формы Параметры

Комментарии:

mrDoc 17 September 2009, 12:10 0 1

Большое спасибо автору статьи. В нете Это искал больше часа. Хоть кто-то человеческим языком объянил! (Специально зарегился чтобы спасибо сказать)

Ответить
Roman 18 September 2009, 07:55 0 0

Пожалуйста.

Ответить
Plastik-x 26 October 2009, 02:32 0 0

Два дня искал похожий пример. Я уж подумал пол интернета мусор пишут ерунду. Попробовав ваш пример и получилось и тут я и разтаял. Респект и уважуха admin.

Ответить
n2es 19 December 2009, 08:20 0 0

А на С++ что-нибудь подобное делегатам реализуемо?

Ответить
Roman 20 December 2009, 08:55 0 0

С C++ не помогу. Точно знаю что реализуемо. Но поскольку лично сам не пишу на нём, то детально не обрисую, что как делать. Если верить MSDN, не так уж и сложно.
Может вот это поможет: msdn.microsoft.com/ru-ru/library/system.delegate.aspx

Ответить
simich 07 April 2010, 03:20 0 0

Спасибо! тоже вчера искал искал и только здесь нашел вразумительное объяснение! СПАСИБО!

Ответить
djnik 23 May 2011, 04:28 0 0

добрый день.
как-то совсем не получается первый способ,
компилятор ругается:
Error 3 'Databank_exp.MainForm.uid_main' is inaccessible due to its protection level

В дочерней форме код такой:
MainForm g = (MainForm)this.Owner;
g.uid_main = «ла ла ла»;

Что это за защитный уровень, о котором говорит, компилятор и как это решить?
Если кто знает поделитесь, пожалуйста.

спасибо.

Ответить
Roman 23 May 2011, 04:42 0 0

Переменная uid_main — public?

Ответить
djnik 23 May 2011, 05:03 0 0

теперь да, исправил… спасибо

а во втором примере, если ругается в форме источнике на
CallBackMy.callbackEventHandler(«Передаваемые данные.»);
— Object reference not set to an instance of an object.

в чем может быть дело?

Ответить
Roman 23 May 2011, 05:35 0 0

Без кода сложно сказать, но похоже на то что обработчик события не существует:

CallBackMy.callbackEventHandler = new CallBackMy.callbackEvent(this.Reload);

Ну и соответственно функция Reload — должна быть там, где обработчик события создаешь.

— Но это только предположение, код нужен чтобы точно сказать.

Ответить
Mozart 26 October 2011, 07:32 1 0

Перед этой строкой нужно создать новую форму: Form2 f2 = new Form2();//в форме-источнике, а после нее уже CallBackMy.callbackEventHandler(«Передаваемые данные.»);

p.s.: Спасибо за статью =)

Ответить
Madster 17 June 2011, 02:41 0 0

Оппа! И опять по поиску я сюда попал. Спасибо за статью!

Ответить
Araun 25 July 2011, 01:56 0 0

Статья действительно хорошая, неплохо бы расширить примерами с использованием заполнения форм сожержащих Datagridview.

Ответить
Roman 25 July 2011, 03:41 0 0

Ну, по программному заполнению DataGridView есть парочка публикаций:
http://kbss.ru/blog/lang_c_sharp/23.html
http://kbss.ru/blog/lang_c_sharp/38.html
Думаю увязать одно с другим не сложно.

Ответить
Guzzler 19 March 2012, 12:38 0 0

Спасибо за хорошую статью, написанную человеческим языком, без воды и отступлений=)

Ответить