Общее количество 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);
... но я должен делать эту несправедливость, поскольку компилятору не нравится она...
Какие-либо идеи?!
Ваш код должен выглядеть примерно так:
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, упомянутые в комментариях:
Да - измените подпись updateTextBox на:
private void updateTextBox(object sender, Eventargs ea)
Хотя это может быть не лучший дизайн. Все выглядело бы намного аккуратнее, если бы вы написали правильный обработчик событий, а затем вызывали бы updateTextBox оттуда ...
Здесь у вас есть «Самый простой пример событий C #, который только можно вообразить».
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);
}
}