C#: нужен один из моих классов для инициирования события в другом классе для обновления текстового поля

Общее количество n00b к C# и событиям, хотя я программировал некоторое время.

У меня есть класс, содержащий текстовое поле. Этот класс создает экземпляр класса менеджера по коммуникации, который принимает кадры от Последовательного порта. У меня есть это все хорошо работать.

Каждый раз кадр принимается, и его данные извлечены, я хочу, чтобы метод работал в моем классе с текстовым полем, для добавления этих данных кадра к текстовому полю.

Так, не отправляя весь мой код у меня есть свой класс формы...

public partial class Form1 : Form
{
    CommManager comm;

    public Form1()
    {
        InitializeComponent();
        comm = new CommManager();

    }

    private void updateTextBox()
    {
        //get new values and update textbox
    }
    .
    .
    .

и у меня есть свой класс CommManager

class CommManager 
{
     //here we manage the comms, recieve the data and parse the frame
}

ТАК... по существу, когда я анализирую тот кадр, мне нужен updateTextBox метод от класса формы для выполнения. Я предполагаю, что это возможно с событиями, но я, может казаться, не заставляю это работать.

Я пытался добавить обработчик событий в классе формы после создания экземпляра CommManager как ниже...

 comm = new CommManager();
 comm.framePopulated += new EventHandler(updateTextBox);

... но я должен делать эту несправедливость, поскольку компилятору не нравится она...

Какие-либо идеи?!

5
задан Matt 1 April 2010 в 10:07
поделиться

4 ответа

Ваш код должен выглядеть примерно так:

public class CommManager()
{
    delegate void FramePopulatedHandler(object sender, EventArgs e);

    public event FramePopulatedHandler FramePopulated;

    public void MethodThatPopulatesTheFrame()
    {
        FramePopulated();
    }

    // The rest of your code here.
}

public partial class Form1 : Form      
{      
    CommManager comm;      

    public Form1()      
    {      
        InitializeComponent();      
        comm = new CommManager();      
        comm.FramePopulated += comm_FramePopulatedHander;
    }      

    private void updateTextBox()      
    {      
        //get new values and update textbox      
    }

    private void comm_FramePopulatedHandler(object sender, EventArgs e)
    {
        updateTextBox();
    }
}

А вот ссылка на Правила именования событий .NET, упомянутые в комментариях:

MSDN - Правила именования событий

10
ответ дан 18 December 2019 в 14:44
поделиться

Да - измените подпись updateTextBox на:

private void updateTextBox(object sender, Eventargs ea)

Хотя это может быть не лучший дизайн. Все выглядело бы намного аккуратнее, если бы вы написали правильный обработчик событий, а затем вызывали бы updateTextBox оттуда ...

0
ответ дан 18 December 2019 в 14:44
поделиться

Здесь у вас есть «Самый простой пример событий C #, который только можно вообразить».

2
ответ дан 18 December 2019 в 14:44
поделиться

    public partial class Form1: Form
    {
        CommManager comm;

        public Form1()
        {
            InitializeComponent();
            comm = new CommManager();
            comm.OnFramePopulated += new EventHandler(updateTextBox);
        }

        private void updateTextBox(object sender, EventArgs ea)
        {
            //update Textbox
        }
    }

    class CommManager
    {
        public EventHandler OnFramePopulated;

        public void PopulateFrame()
        {
            OnFramePopulated(this, null);
        }
    }
1
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: