Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Создание событий c#  [new]
Serega325
Member

Откуда:
Сообщений: 62
Здравствуйте форумчане, создал собственный контрол "MyControl", подскажите пожалуйста возможно ли в C# создать свое событие обработки нажатия клавиши на контроле, т.е. должно быть что-то вроде этого this.MyKeyDown += OnMyEventKey;
11 авг 16, 10:54    [19528170]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Изопропил
Member

Откуда:
Сообщений: 30304
Serega325,

можно
     public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        public event EventHandler MyKeyDown;

        protected void fireMyKeyDown(object sender, KeyEventArgs e)
        {
            if (MyKeyDown != null) MyKeyDown(sender, e);
        }

        private void MyControl_KeyDown(object sender, KeyEventArgs e)
        {
            // Например
            if (e.Shift) fireMyKeyDown(sender, e);
        }
    }
11 авг 16, 11:23    [19528376]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Serega325
Member

Откуда:
Сообщений: 62
Изопропил
Serega325,

можно
     public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        public event EventHandler MyKeyDown;

        protected void fireMyKeyDown(object sender, KeyEventArgs e)
        {
            if (MyKeyDown != null) MyKeyDown(sender, e);
        }

        private void MyControl_KeyDown(object sender, KeyEventArgs e)
        {
            // Например
            if (e.Shift) fireMyKeyDown(sender, e);
        }
    }

Выдает ошибку
Error 1 No overload for 'MyControl_KeyDown' matches delegate 'System.EventHandler'
Заменил EventHandler на KeyEventHandler ошибки нет, но событие не срабатывает.
11 авг 16, 11:50    [19528534]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Изопропил
Member

Откуда:
Сообщений: 30304
Serega325
Заменил EventHandler на KeyEventHandler ошибки нет, но событие не срабатывает.

правильно заменил.

До fireMyKeyDown дело доходит?
11 авг 16, 13:56    [19529308]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Serega325
Member

Откуда:
Сообщений: 62
Изопропил
Serega325
Заменил EventHandler на KeyEventHandler ошибки нет, но событие не срабатывает.

правильно заменил.

До fireMyKeyDown дело доходит?


Даже MyControl_KeyDown не вызывается.
проверял через MessageBox

public void MyControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show(e.KeyCode.ToString());
// Например
// if (e.Shift) fireMyKeyDown(sender, e);
}
11 авг 16, 14:01    [19529341]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Pallaris
Member

Откуда: Украина, Донецк
Сообщений: 1565
Serega325,

так а сам контрол на keydown подписан?
11 авг 16, 14:06    [19529365]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Serega325
Member

Откуда:
Сообщений: 62
Pallaris
Serega325,

так а сам контрол на keydown подписан?


private void InitializeComponent()
{
this.SuspendLayout();
//
// MyControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Name = "MyControl";
this.Size = new System.Drawing.Size(244, 240);
this.MyKeyDown += new System.Windows.Forms.KeyEventHandler(this.MyControl_KeyDown);
this.ResumeLayout(false);

}


public partial class MyControl : UserControl
{

public MyControl()
{
InitializeComponent();

board = new char[columnCount, rowCount];
for (int i = 0; i < columnCount; i++)
{
for (int j = 0; j < rowCount; j++)
board[i, j] = ' ';
}

pen = new Pen(foreColor, penWidth);
this.BackColor = Color.White;
caretThread = new Thread(new ThreadStart(ShowCaret));
caretThread.Start();
}

public event System.Windows.Forms.KeyEventHandler MyKeyDown;

protected void fireMyKeyDown(object sender, KeyEventArgs e)
{
if (MyKeyDown != null) MyKeyDown(sender, e);
}

public void MyControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show(e.KeyCode.ToString());
// Например
// if (e.Shift) fireMyKeyDown(sender, e);
}
}
11 авг 16, 14:15    [19529420]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
Pallaris
Member

Откуда: Украина, Донецк
Сообщений: 1565
Serega325,

Контрол-то надо подписывать на keydown, а не на mykeydown
12 авг 16, 03:39    [19532218]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
stut
Member

Откуда:
Сообщений: 454
Не могу понять один базовый момент шарпа, а именно проверку на наличие события (if event!=null). Вот есть у меня событие в неком класе: public event NewMailEventHandler OnNewMailHandler; protected void OnNewMail(NewEmailEventArgs e) { IF (OnNewMailHandler!=null) OnNewMailHandler(this,e) }. То есть как осуществляется проверка что события не равно null? И потом я так понимаю вызывается делегат на котором построено событие ибо он имеет эти стандармых два параметра? Это в класе субскрайбера. В консумере же есть такая строка - classobject.OnNewMailHandler+=new EmailNotify.NewMailEventHandler(IHaveMail); Или наличие событие проверяется уже в ходе запуска этой строки из метода мейн: emailNotify.NotifyMail("Hello","Welcome to Events"); // void NotifyMail(string subject, string message){ NewEmailEventArgs e=new NewEmailEventArgs(subject,message); OnNewMail(e);} Последний клас, что наследует EventArgs имеет собственно поля и свойства: сабджект и меседж- на основе того есть ли они пустые (но их 2) и определяется наличие событие?
7 авг 17, 22:40    [20706798]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
fortibransa
Member

Откуда: СПб
Сообщений: 20787
stut
Не могу понять один базовый момент шарпа, а именно проверку на наличие события (if event!=null). Вот есть у меня событие в неком класе: public event NewMailEventHandler OnNewMailHandler; protected void OnNewMail(NewEmailEventArgs e) { IF (OnNewMailHandler!=null) OnNewMailHandler(this,e) }. То есть как осуществляется проверка что события не равно null? И потом я так понимаю вызывается делегат на котором построено событие ибо он имеет эти стандармых два параметра? Это в класе субскрайбера. В консумере же есть такая строка - classobject.OnNewMailHandler+=new EmailNotify.NewMailEventHandler(IHaveMail); Или наличие событие проверяется уже в ходе запуска этой строки из метода мейн: emailNotify.NotifyMail("Hello","Welcome to Events"); // void NotifyMail(string subject, string message){ NewEmailEventArgs e=new NewEmailEventArgs(subject,message); OnNewMail(e);} Последний клас, что наследует EventArgs имеет собственно поля и свойства: сабджект и меседж- на основе того есть ли они пустые (но их 2) и определяется наличие событие?
беспредел, уже даже Enter отсутствует.
8 авг 17, 07:33    [20707028]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
stut
Member

Откуда:
Сообщений: 454
fortibransa,
нету на т/ф ентера
8 авг 17, 16:21    [20708879]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
fortibransa
Member

Откуда: СПб
Сообщений: 20787
stut
fortibransa,
нету на т/ф ентера
Гм, у всех есть, а у тебя куда подевался.
9 авг 17, 07:11    [20709759]     Ответить | Цитировать Сообщить модератору
 Re: Создание событий c#  [new]
stut
Member

Откуда:
Сообщений: 454
Вот я несколько переделал с помощью ентера:
Не могу понять один базовый момент шарпа, а именно проверку на наличие события
 (if event!=null) 
.
Вот есть у меня событие в неком класе:
 public event NewMailEventHandler OnNewMailHandler; protected void OnNewMail(NewEmailEventArgs e) { IF (OnNewMailHandler!=null) OnNewMailHandler(this,e) }. 
То есть как осуществляется проверка что события не равно null? И потом я так понимаю вызывается делегат на котором построено событие ибо он имеет эти стандармых два параметра? Это в класе субскрайбера. В консумере же есть такая строка -
 classobject.OnNewMailHandler+=new EmailNotify.NewMailEventHandler(IHaveMail);

Или наличие событие проверяется уже в ходе запуска этой строки из метода мейн:
 emailNotify.NotifyMail("Hello","Welcome to Events");
 void NotifyMail(string subject, string message){ NewEmailEventArgs e=new NewEmailEventArgs(subject,message); OnNewMail(e);} 

Последний клас, что наследует EventArgs имеет собственно поля и свойства: сабджект и меседж- на основе того есть ли они пустые (но их 2) и определяется наличие событие?
19 сен 17, 16:31    [20806609]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить