C #: нужен один из моих классов, чтобы вызвать событие в другом классе, чтобы обновить текстовое поле - PullRequest
5 голосов
/ 01 апреля 2010

Всего 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);

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

Есть идеи?!

Ответы [ 4 ]

10 голосов
/ 01 апреля 2010

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

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 - Правила именования событий

2 голосов
/ 01 апреля 2010

Здесь у вас есть «Самый простой пример событий C # Imaginable».

1 голос
/ 01 апреля 2010

    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);
        }
    }
0 голосов
/ 01 апреля 2010

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

private void updateTextBox(object sender, Eventargs ea)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...