代码之家  ›  专栏  ›  技术社区  ›  Matt

C:需要我的一个类触发另一个类中的事件来更新文本框

  •  5
  • Matt  · 技术社区  · 14 年前

    虽然我已经编程了一段时间,但从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实例后,我尝试在form类中添加一个事件处理程序,如下所示…

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

    …但我一定是做错了,因为编译器不喜欢它…

    有什么想法吗?!

    4 回复  |  直到 14 年前
        1
  •  10
  •   Justin Niessner    14 年前

    您的代码应该类似于:

    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 - Event Naming Guidelines

        2
  •  2
  •   thelost    14 年前

    Here 你有“想象中最简单的C事件例子”。

        3
  •  1
  •   Asher    14 年前
    
        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);
            }
        }
    
        4
  •  0
  •   Martin Milan    14 年前

    是-将UpdateTextBox的签名更改为:

    private void updateTextBox(object sender, Eventargs ea)
    

    尽管这可能不是最好的设计。如果您编写了一个合适的事件处理程序,然后从那里调用updatetextbox,事情看起来会更整洁…