Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> и снова Event 
V
    Опции темы
Zmeevic
Дата 21.6.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.6.2007

Репутация: нет
Всего: нет



Что-то туплю, работаю не на своем компе, и глянуть негде, вопрос такой :
Есть Form1 (контенер), у нее есть две дочерние формы Form2, Form3
на Form3 находится UserControlA,  у которого есть EventB, как подписаться на этот EventB в Form1, если Form3 вызывается от Form2.

Т.е. Form1(основная) -> вызов Form2 -> вызов Form3(событие на которое нужно подписаться в Form1)?  {С#}

За ранее спасибо, ибо память у меня куриная… 

PM MAIL   Вверх
tol05
Дата 21.6.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Что-то ты такого накрутил! Непонятно...
Что значит "вызов"? создание через new? Или они создаются вместе (я имею в виду Form2, Form3), просто form2.Show() вызывается в коде form1, а form3.Show() - в коде form2?

Одним словом, предполагаю самый "запущенный" вариант и советую:
Код

//Я не знаю что за событие, что за параметры и возвращаемое значение. Проставь нужное
delegate <returnType> EventBHandler(<parameters>);

class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

void SomeHandler() //Там, где ты создаешь Form2
{
...
Form2 f2 = new Form2(new EventBHandler(MainHandler));
...
}

<returnType> MainHandler(<parameters>)//EventBHandler твой обработчик главной формы
{
...
}
}

class Form2 : Form
{
EventBHandler myHandler;

public Form2(EventBHandler handler)
{
InitializeComponent();
myHandler = handler;
}

void SomeHandler() //Там, где ты создаешь Form3
{
...
Form3 f3 = new Form3(myHandler);
...
}

}

class Form3 : Form
{
UserControlA uca;
public Form2(EventBHandler handler)
{
InitializeComponent();
uca.EventB += handler;
}
}


можно делегат и не передавать в конструкторе, сделать через свойства передачу обработчика попозже. Ну, это надо смотреть по ситуации...


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Zmeevic
Дата 22.6.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.6.2007

Репутация: нет
Всего: нет



Упростил, есть главная форма Form1, при загрузке сделали и показали Form2, на ней  кнопка - нажали-> сделали и показали Form3, на ней также кнопка - нажали-> отловили это событие в Form1 (Вывели сообщение)

Код

//Форма 1
delegate void EventBHandler(object sender, EventArgs e);

    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)//при загрузке сделали и показали F2
        {
            Form2 F2 = new Form2(new EventBHandler(MainHendler));
            F2.MdiParent = this;
            F2.Dock = DockStyle.Fill;
            F2.Show();
        }

        void MainHendler(object sender, EventArgs e)//обработчик главной формы
        {
            MessageBox.Show("Вызов!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
}
//Форма 2
public partial class Form2 : Form
    {
        EventBHandler myHandler;
        
        public Form2(EventBHandler handler)
        {
            InitializeComponent();
            myHandler = handler;
        }
        
        private void BShowF3_Click(object sender, EventArgs e)//нажали на кнопку сделали и показали F3
        {
            Form3 F3 = new Form3(myHandler);
            F3.MdiParent = Form1.ActiveForm;
            F3.Dock = DockStyle.Fill;
            F3.Show();
        }
    }
//Форма 3
public partial class Form3 : Form
    {
        
       public Form3(EventBHandler handler)
       {
           InitializeComponent();
           BShowF2.Click += EventBHandler(handler);
       }

    }

Вот переделал под приведеный выше пример, но где-то ошибся компилятор ругается в конструкторах Form2  и Form3
хотя, как мне кажется, принцип понял надо протягивать по цепочке переменую, т.е. а как быть если форм больше, к примеру их 10, причем каждая создаётся одна из другой, а на 10-й просходит некоторой событие, которое необходимо отловить в 1-й Форме?
Мигрирую с дельфей...
FAQ, смотрел, но когда формы две - то никаких проблем на подписку о событии, а вот когда их больше...
PM MAIL   Вверх
tol05
Дата 22.6.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Можно и не протягивать... 
Код

delegate <returnType> EventBHandler(<parameters>);

class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

static <returnType> MainHandler(<parameters>)//EventBHandler твой обработчик главной формы
{
...
}
}


а потом, сколько бы ни было дочерних форм. когда бы они не появлялись, они всегда смогут сами создать этот делегат и подвязать к событию своего контрола. Правда, поскольку у дочерней формы F2.MdiParent = this; устанавливается после выхода из конструктора, предлагаю сделать через свойство работу с делегатом
Код

class Form1234 : Form
{
UserControlA uca;

public EventBHandler Handler
{
 set {uca.EventB += value;}
}

public Form1234()
{
InitializeComponent();
}
}

...
class Form1233 : Form
{
...
Form1234 F1234 = new Form1234();
F1234.MdiParent = ...//Любая форма, какая тебе нужна
F1234.Handler = new EventBHandler(Form1.MainHandler);//Сделал static, что б не морочиться с передачей по цепочке делегата
F1234.Dock = DockStyle.Fill;
F1234.Show();
...
}

 smile

Это сообщение отредактировал(а) tol05 - 22.6.2007, 10:09


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Zmeevic
Дата 22.6.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.6.2007

Репутация: нет
Всего: нет



В полне возможно что где-то я туплю, но:
Код



//Клас Form2
public partial class Form2 : Form
    {

        public EventBHandler Handler
//компилятор ругается на Handler
//Inconsistent accessibility: property type 'Proba.EventBHandler' is less accessible than property 'Proba.Form2.Handler'

        {
            set { button1.Click += value; }
        }

        public Form2()
        {
            
            InitializeComponent(); 
        }
        
        .......
    }



tol05, если не затруднит, можешь дать пример, простой :
две формы, одна основная у нее дочерняя, на дочерней нажали на кнопку ->
обработали это событие в основной, без протягивания, т.к. форм больше…

PM MAIL   Вверх
tol05
Дата 22.6.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Код

namespace WindowsApplication1
{
    public partial class Form1 :Form
    {
        public Form1()
        {
            InitializeComponent();
            del = MyHandler;
            this.IsMdiContainer = true;
        }

        public void MyHandler(object sender, EventArgs e)
        {
            Text = "Говорят, что вроде нажали на Button формы Form2";
        }

        private static EventHandler del;

        public static EventHandler MainHandler
        {
            get
            {
                return del;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.MdiParent = this;
            f2.Show();
        }
    }
}

обработку клика я сделал и в дочерней форме, для наглядности smile
Код

namespace WindowsApplication1
{
    public partial class Form2 :Form
    {
        public Form2()
        {
            InitializeComponent();
            button1.Click += Form1.MainHandler;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Text = "Нажали на Button формы Form2";
        }
    }
}




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Zmeevic
Дата 22.6.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.6.2007

Репутация: нет
Всего: нет



Огромное, человеческое СПАСИБО!!! smile 
а то я бы долго:  smile 
а теперь  smile

Добавлено через 2 минуты и 9 секунд
Вопрос решен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.