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

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

31.07.2014, 10:53. Просмотров 1223. Ответов 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(...);
        }
    }
}
И главная форма не видит обработчик. Собственно хотелось бы узнать, как это правильно сделать.
http://www.cyberforum.ru/windows-forms/thread1687029.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 10:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вынести обработчики событий в отдельный класс (C#):

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

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

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

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

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

8
insite2012
Модератор
Эксперт .NET
4788 / 3747 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 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 / 1
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:16  [ТС] #3
insite2012, а обратиться к контролам формы мы не может, потому что для этого в функцию надо "передать sender и e"?
0
insite2012
Модератор
Эксперт .NET
4788 / 3747 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 2
31.07.2014, 11:22 #4
seeker95, sender - это объект, который вызвал событие (в данном случае кнопка), а е - аргумент этого события. Как я уже сказал, можно извратиться и сделать контролы public, передав в конструктор класса с обработчиками экземпляр класса формы (или, как вариант, отдельный static class с автосвойствами), но это увеличит объем кода и усложнит программу. Для чего это надо?
0
seeker95
0 / 0 / 1
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:27  [ТС] #5
insite2012, а не додумал с тем, что передавать надо в конструктор класса. Ну, в оригинальном проекте там обработчик одной кнопки на ~700 строк и их несколько, я хотел вынести обработчик для каждой группы кнопок в отдельные классы, что бы повысить читаемость кода (аргумент, наверно, не самый серьезный)
0
XRoy
860 / 710 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
31.07.2014, 11:30 #6
seeker95,
Вынесите из обработчика код в функции, и функции уже можно и в отдельный класс поместить.
0
insite2012
Модератор
Эксперт .NET
4788 / 3747 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 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 / 1
Регистрация: 18.12.2009
Сообщений: 17
31.07.2014, 11:33  [ТС] #8
XRoy, да, я уже так сделал, после этого захотелось как-то уйти от обработчиков, которые состоят из одной строчки кода
0
insite2012
Модератор
Эксперт .NET
4788 / 3747 / 1081
Регистрация: 12.10.2013
Сообщений: 10,986
Записей в блоге: 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