Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > события составного элемента управления


Автор: jackfall 27.1.2009, 16:45
Создал составной элемент управления, панелька, кнопка и текст. накидал их потом на форму, ставлю события на нажатие мыши, а нет( не работает вообще. Вообще никакие события е работают. Может их надо было как то переопределять когда создавал ЭУ? Подскажите плз.

Автор: antikom 27.1.2009, 17:22
Смотря какое событие. Покажи код будем разбираться.

Автор: jackfall 27.1.2009, 19:48
та из стандартных.. в окне выбрать.. например MouseDown. 

Автор: antikom 28.1.2009, 12:02
Попробуй переопределить событие:
Код

protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
        }

Автор: Unlocker 28.1.2009, 12:23
Нет никаких проблем для перехвата событий на контроле.
Порядок действий очень простой. 
не надо ничего переопределять.
1)ставишь прослушку сообщений о событиях
Код

this.PictureBox.MouseUp += new MouseEventHandler(SetZeroPoint);

2)определяешь реакцию на событие
Код

private void SetZeroPoint(object sender, MouseEventArgs e)
{
    ...
}

3)вырубаешь прослушку, когда необходимо
Код

this.PictureBox.MouseUp -= new MouseEventHandler(SetZeroPoint);


Практически тоже самое можно сделать и в дизайнере VS, но если надо управлять прослушкой сообщений гибко, т.е. от одинаковых событий действовать по-разному, то придется вручную управлять прослушкой и перенаправлением вызовов (callback). в остальном все прозрачно. если что-то неясно, то рекомендую книги Э. Троелсена, потому что там это хорошо и просто описано.

Автор: jackfall 28.1.2009, 14:48
antikom, пробовал переопределять - не помогает.

Unlocker, это тоже не работает(

Автор: Unlocker 28.1.2009, 14:55
Тогда код в студию. Я это сделал три дня назад, и это работало. 
+ требуются объяснения какие события нужны, как осуществляется проверка событий?

Автор: jackfall 29.1.2009, 16:07
Ну.. я незнаю..  поможет ли код компонента:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace WindowsFormsApplication1
{
    public partial class FormSketch : UserControl
    {
        public FormSketch()
        {
            InitializeComponent();
        }

       Всякие переменные

       Публичные свойства с get, set

       может проблема в следующих методах? 

        private void buttonClose_MouseEnter(object sender, EventArgs e)
        {
           тоже код..
        }

        private void buttonClose_MouseLeave(object sender, EventArgs e)
        {
             тоже код..
        }

        private void panelBody_Paint(object sender, PaintEventArgs e)
        {
           тоже код..
        }

        private void buttonClose_BackColorChanged(object sender, EventArgs e)
        {
            тоже код..
        }

        private void labelLogo_ForeColorChanged(object sender, EventArgs e)
        {
            тоже код..
        } 
    }
}



Ну и там где я на форму поставил этот ЭУ такой вот обработчик к примеру (ну и в дезайнере стоит автоматически добавление обработчика на это):

Код

private void formSketch5_MouseClick(object sender, MouseEventArgs e)
        {
            код.. и сюда никогда не переходит управление((
        }


Автор: Unlocker 29.1.2009, 16:38
Код смотреть надо в других местах.
1) Надо раскрыть код дизайнера (#region "InitializeComponents") и посмотреть какие события у каких компонентов объявлены на прослушку. Этот код тоже нужен.
2) Если ты хочешь создать событие, отличное от стандартных событий компонентов контрола, то надо прописать делегатов для данного вида событий, и непосредственно само событие.
В зависимости от пожеланий делаются разные манипуляции.
И, запомни, с дизайнером нужно работать по принципу: "доверяй, но проверяй".

Автор: jackfall 29.1.2009, 17:16
Unlocker, Свои события делал, это без проблем. научился)
а вот что тут такое непонятно(

В дизайнере есть

Код

this.formSketch5.MouseClick += new System.Windows.Forms.MouseEventHandler(this.formSketch5_MouseClick);

Автор: Unlocker 29.1.2009, 17:40
В таком случае могу посоветовать воспользоваться встроенным в студию дебаггером.
Если ничего не получится, то можешь залить на форум архив с проектом, постараюсь выяснить в чем дело.

Автор: diadiavova 29.1.2009, 18:01
В прилагаемом проекте есть контрол, на который я бросил две панели. Клик по нижней панели вызывает событие "Click" самого контрола. В форме для него назначен обработчик.

Автор: jackfall 30.1.2009, 17:50
diadiavova, да, так работает. Но тогда если я хочу чтобы клик ЭУ происходил при нажатии на любой компонент в самом ЭУ  то так на все нужно сделать внутри него.. на кнопку, на панель, на надпись.. например.

Unlocker, Прикладываю пример... просто мой ЭУ (панель, надпись и кнопка) на форме.
событие
Код

  private void myUserControl1_MouseClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("Нажато!");
        }

не происходит. вобщем-то я догадываюсь почему.. В самом ЭУ ведь есть основа - MyUserControl. Видимо при вышеуказанном событии myUserControl1_MouseClick клик должен происходить по ней чтобы вызвалось, а она внизу.. под панелью. И поэтому наверно не происходит. Подскажите... может я чего-то просто не учел)

Автор: Unlocker 30.1.2009, 18:04
Все верно, события клика не происходит, потому что клик идет по дочерним контролам.
Тут два варианта можно предложить:
1) сделать контролы прозрачными для взаимодействия, установив свойство 
Код

Control.Enabled = false;
 если обрабатывать события дочерних контролов не предполагается в принципе.
2) перехватывать события дочерних контролов и перенаправлять их форме UserControl. Этот вариант гибче, но сложнее, т.к. придется управлять самостоятельно перенаправлением обработчиков событий.
Все зависит от поставленной задачи и требований к ее выполнению по времени и функционалу.

Автор: jackfall 30.1.2009, 18:31
Unlocker, если enabled ставить false, то они и выглядят неактивными...

всем спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)