_Q12_ Ответов: 1

Как я могу запустить событие из класса 2 либо в control1, либо в form1 ?


У меня есть Class2, Form1 и Control1.
class Class2
{

    public int number = 0;
    public string name = "X";

    public event EventHandler DataAvailable;
    public void OnDataAvailable(EventArgs e)
    {
        if (DataAvailable != null) DataAvailable(this, e);
    }
}


1 - Когда я нажимаю кнопку в Control1, я обновляю "номер" в Class2.
2 - Когда я нажимаю кнопку в форме 1, я обновляю "номер" в классе 2.
3 - событие из Class2 срабатывает каждый раз, когда кнопка нажата из любого элемента управления(Form1 или Control1) ; и обновляет label1, также в обоих элементах управления, и label1 из любого элемента управления показывает номер из Class2.
Ясно, как грязь?

Как я могу это сделать? Так как Class2 должен быть объектом в Form1 или Control1, но не обоими, так как это будут 2 объекта. Кроме того, не делая Class2 статичным.

Спасибо.

Что я уже пробовал:

много чего было с 2005 года..................................

1 Ответов

Рейтинг:
2

OriginalGriff

Вы можете создать открытый метод в Class2, который запускает событие, и вызвать его из других местоположений.

Или сделайте number свойством - что в любом случае должно быть, публичные поля, как правило, плохая идея - и запустите even, когда он будет изменен в сеттере.

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


_Q12_

Я сделал эту версию:

статический публичный класс Class1
{
статический публичный Class2 c2 = новый Class2();
}
и я могу вызвать c2 либо из Form1, либо из Control1. Я уже заставил его работать в Control1. Теперь я думаю, как заставить его работать для формы 1. Есть идеи?
Я также попробую ваше предложение, но я редко работаю с недвижимостью.Я не настолько к ним привыкли. Я понятия не имею, на что они годятся и для чего они предназначены. Поля легкие и простые.
Я уже сделал это и работаю на Control1:
общественные файл usercontrol1()
{
метод InitializeComponent();
Class1.c2.DataAvailable += новый EventHandler(c2_DataAvailable);
}
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
Класс1.С2.количество++;
этикетка 1.Текст = Class1.c2.number.Метод toString();
}

c2_DataAvailable недействительным(объект отправителя, EventArgs в электронной)
{
Класс1.С2.OnDataAvailable(нуль);
}

OriginalGriff

Почему вы делаете ваши занятия статичными?
Извините, но либо я что-то упускаю, либо этот дизайн выглядит так, будто его собрали без всякой реальной мысли.

_Q12_

Hmm, its not that hard what im asking. Hard is the implementation and probably impossible as I can see it so far. I give you an example: You see in a game, when you have a Main screen (Form1 in my case), where all the game is rendered, and when you click on some elements inside that Main screen, other little menus pop up (Control1,2,3etc in my case) and after changing some values there, you close those menus and the changes are reflected back in main screen(Form1). Simple, right? Also, what is happening in main screen (Form1), some values are being stored and updated somewhere, and when a menu is opened, those stored values are shown inside it. For example, upgrades of building, resource field, etc. I want to create something similar too. That's it.

OriginalGriff

Да - и вы идете по всем домам, чтобы сделать это, когда простое решение состоит в том, чтобы Form2 / Control 1 уведомить Form1 об изменении и позволить ему справиться с этим. Таким образом, формы / элементы управления становятся независимыми, что гораздо лучше формирует OOPs POV, а также снижает сложность (и, следовательно, надежность и ремонтопригодность) всей вашей системы. Взгляните на ссылку, и это два "компаньонских" совета - они охватывают этот материал.

_Q12_

Я все еще не понимаю. Не могли бы вы быть так любезны сделать для меня образец(функционального) кода? (не псевдокод - а очень простой нормальный код) Спасибо.

OriginalGriff

Что случилось со ссылкой, которую я дал? Неважно...
https://www.codeproject.com/Tips/548131/Transferring-information-between-two-forms-Part-2
Он включает в себя образец - он говорит о формах, но это точно то же самое для элементов управления и общих классов.

_Q12_

Вы не знаете, что случилось со ссылкой, которую вы мне даете, потому что это вторая тема, которую я открыл, но на подобную тему. Это я виноват, а не ты. Да, я прочитал то, что вы написали в этой статье, я понимаю это, я открыл и скомпилировал ваш пример кода оттуда. Все хорошо, я это прекрасно понимаю. Так вот, это способ делать вещи. Это единственный возможный путь ? Я хочу что - то более интуитивное и немного более простое в реализации. Можете ли вы следовать моей логике, которую я описал в начале этой темы, и построить что-то на ней, идя по правилам и принципам, которые вы уже знаете? Пожалуйста. И спасибо Вам за ваши потрясающие ответы.

OriginalGriff

Нет - это способ сделать это, и это действительно не сложно, когда вы освоитесь - это тот же самый способ, которым работает все остальное в вашем приложении, просто вы создаете события.
Что тоже довольно просто сделать - я использую фрагмент кода, чтобы заполнить пробелы для себя:
https://www.codeproject.com/Articles/400287/A-simple-code-snippet-to-add-an-event
Затем все, что мне нужно сделать, это набрать "prop" и дважды нажать TAB, и появится скелет события. Заполните детали, а затем просто позвоните OnMyEventName, когда я хочу подать сигнал. Сделано.

Попробуйте - это довольно легко, когда вы получите повесить его.