Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
seeker95
0 / 0 / 0
Регистрация: 18.12.2009
Сообщений: 17
1

Вынести обработчики событий в отдельный класс

31.07.2014, 10:53. Просмотров 1306. Ответов 8
Метки нет (Все метки)

Доброго времени суток. Столкнулся с проблемой, которая уже вроде неоднократно поднималась на форуме, но применить это к своей задаче я так и не смог. Есть форма с одной кнопкой и одним лейблом. Нужно выполнить вот такое простое действие:
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "Работает";
}
А мне бы хотелось, что бы обработчик события был вынесен в отдельный класс, например, Buttons. Проблема заключается в том, что я делаю это вот так:
C#
1
2
3
4
5
6
7
8
9
10
namespace Project
{
    class Buttons : Form1 // Наследование
    {
        public void btn_Click(object sender, EventArgs e)
        {
            label1.Text = "Работает";
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
namespace Project
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += new EventHandler(...);
        }
    }
}
И главная форма не видит обработчик. Собственно хотелось бы узнать, как это правильно сделать.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 10:53
Ответы с готовыми решениями:

Вынести код обработчиков кнопок в отдельный класс
Здравствуйте. Мальчики... возможно, и девочки, помогите. С#, Windows Form....

Основную часть кода вынести из класса формы в отдельный класс
У меня весь код находится в коде формы, а мне нужно основную часть написать в...

Как вынести метод, обрабатывающий включение радиокнопок, в отдельный класс
Есть радиобаттоны в форме. собственно в классе формы есть метод ...

Обработчики событий
Предположим имеется форма с 2мя компонентами: button1 и PictureBox1. Для них...

Обработчики событий WinForm
Разместите на форме три кнопки (Button) и одно поле ввода (TextBox). Сделайте...

8
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
31.07.2014, 11:06 2
seeker95, не очень хорошая идея, ятд. Основная проблема будет в том, что из другого класса будет невозможно обратиться к контролам формы. Нет, конечно можно извратиться и сделать их public, но это не есть хорошо... Правильный вариант - свое событие, однако тогда количество событий удваивается (в форме событие клика, в классе по событию клика событие для реакции контрола...). В чем тогда выгода?

Добавлено через 1 минуту
Если без обращения к эл. управления, то вот так...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += delegate 
            {
                MyHandlers handlers = new MyHandlers();
                handlers.btnClickHandler();
            };
        }
    }
 
    class MyHandlers
    {
        public void btnClickHandler()
        {
            //Тут что-то делаем, но не обращение к контролам формы!
        }
    }
}
0
seeker95
0 / 0 / 0
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:16  [ТС] 3
insite2012, а обратиться к контролам формы мы не может, потому что для этого в функцию надо "передать sender и e"?
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
31.07.2014, 11:22 4
seeker95, sender - это объект, который вызвал событие (в данном случае кнопка), а е - аргумент этого события. Как я уже сказал, можно извратиться и сделать контролы public, передав в конструктор класса с обработчиками экземпляр класса формы (или, как вариант, отдельный static class с автосвойствами), но это увеличит объем кода и усложнит программу. Для чего это надо?
0
seeker95
0 / 0 / 0
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:27  [ТС] 5
insite2012, а не додумал с тем, что передавать надо в конструктор класса. Ну, в оригинальном проекте там обработчик одной кнопки на ~700 строк и их несколько, я хотел вынести обработчик для каждой группы кнопок в отдельные классы, что бы повысить читаемость кода (аргумент, наверно, не самый серьезный)
0
XRoy
861 / 711 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
31.07.2014, 11:30 6
seeker95,
Вынесите из обработчика код в функции, и функции уже можно и в отдельный класс поместить.
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
31.07.2014, 11:33 7
Лучший ответ Сообщение было отмечено seeker95 как решение

Решение

seeker95, так в чем проблема... Класс формы создан как partial (разделяемый). Добавьте еще один файл с кодом, и выносите туда все обработчики... Примерно так...
Форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += delegate 
            {
                btnClickHandler();
            };
        }
    }
}
Отдельный файл с обработчиками
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private void btnClickHandler()
        {
            label1.Text = "Работает!";
        }
    }
}
И все отлично будет работать...
2
seeker95
0 / 0 / 0
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:33  [ТС] 8
XRoy, да, я уже так сделал, после этого захотелось как-то уйти от обработчиков, которые состоят из одной строчки кода
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
31.07.2014, 11:34 9
Проект -> Добавить новый элемент -> Файл с текстом программы.
0
31.07.2014, 11:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 11:34

Обработчики событий работают не корректно
Вечер добрый коллеги. Есть проблемка с обработкой событий в формах. Имеются две...

Не работают обработчики событий по конпкам на вкладках
Не могу понять в чем причина, сделал обработчик одним сообщением для упрощения...

Обработчики событий для коллекции TextBox
Суть в том что у меня есть коллекция TextBox ов и для некоторых из них я хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru