微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

事件处理程序和委托简单问题

如何解决事件处理程序和委托简单问题

| 我有一个简单的应用程序。这是它的工作方式。我有一个从Windows.Forms继承的类(MyForm)。它具有一个按钮,一个标签一个文本框。它看起来像一个聊天窗口。 还有另一个类(Cliente),它使用字符串数组,并为该数组中的每个元素返回一个带有MyForm实例的List。 我有第三堂课(Prueba),它利用前面的两堂课对其进行了测试。此类创建MyForm的四个实例,并显示它们。 (我会省略一些代码功能,因为我知道它可以正常工作。) 我需要能够在一个窗口中键入内容,然后单击按钮,它应该广播此消息并将其显示在所有其他窗口中。 我知道我必须使用事件处理程序和委托,但经过数小时无处不在的教程学习后,我才知道该放在哪里。 你能帮我吗?如果您可以为我提供一个好的教程或示例,就足够了,但是如果您对我的代码更具体,那就太好了。 (我无法弄清楚如何使MyForm的一个实例知道其他实例,谁应该是此处的侦听器?我以为是Client,但看不到如何做到这一点。) 任何帮助将不胜感激!
    //MyForm
    namespace Dia26 {

        //public delegate void ChangedEventHandler(object sender,EventArgs e);

        public class MyForm : System.Windows.Forms.Form {
            public Button btn = new Button();
            public TextBox textBox = new TextBox();
            public Label label = new Label();
            public Button btnEnviar = new Button();

            public delegate void OwnerChangedEventHandler(string newOwner); //~
            public event OwnerChangedEventHandler OwnerChanged;

            protected void btn_Click(object sender,System.EventArgs e) {
                this.Close();
            }

            protected void btnEnviar_Click(object sender,System.EventArgs e) {
                label.Text += textBox.Text + \"\\n\";
                textBox.Text = \"\";
                if (this.OwnerChanged != null) {
                    this.OwnerChanged(\"something?\");
                }
            }

            public MyForm() {
                btn.Text = \"cerrar\";
                btn.Left = 400;
                btn.Top = 280;
                btn.Click += new EventHandler(this.btn_Click);
                btnEnviar.Click += new EventHandler(this.btnEnviar_Click);

                textBox.Left = 15;
                textBox.Top = 20;
                textBox.Width = 330;

                label.Left = 15;
                label.Top = 50;
                label.AutoSize = false;
                label.Height = 210;
                label.Width = 450;
                label.BackColor = Color.White;

                btnEnviar.Left = 350;
                btnEnviar.Top = 17;
                btnEnviar.Text = \"Enviar\";

                this.Controls.Add(textBox);
                this.Controls.Add(label);
                this.Controls.Add(btn);
                this.Controls.Add(btnEnviar);

                this.SuspendLayout();
                this.Name = \"MyForm\";
                this.ResumeLayout(false);

                return;
            }
        }
    }


    //Cliente.cs
 namespace Dia26Prueba {
    public class Cliente {
        public int creadas;
        public int nocreadas;

        public List<MyForm> MostrarVentanas(out bool error,ref int creadas,params string[] nombres) {
            List<MyForm> list = new List<MyForm>();

            int bienCreadas = 0;
            foreach (string str in nombres) {
                if (str.Length >= 1) {
                    MyForm mf = new MyForm();
                    mf.Text = str;
                    //mf.OwnerChanged += new OwnerChangedEventHandler(mf_OwnerChanged);
                    list.Add(mf);
                    mf.Show();
                    bienCreadas++;
                }
            }

            error = (bienCreadas == creadas);
            nocreadas = bienCreadas - creadas;
            creadas = bienCreadas;

            return list;
        }

        public void ModificarPosicionYMedidas(MyForm mf,int x = 262,int y = 209,int width = 500,int height = 350) {
            mf.Left = x;
            mf.Top = y;
            mf.Width = width;
            mf.Height = height;
        }
    }
}

// Prueba
namespace Dia29 {
    class Prueba {
        static void Main(string[] args) {
            Cliente cliente = new Cliente();
            int n = 4;

            Console.WriteLine(cliente.Autor);

            if (args.Length != n) {
                return;
            }

            int InstanciasCreadas = n;
            bool HayErrores;
            List<Dia26.MyForm> list;

            list = cliente.MostrarVentanas(
               creadas: ref InstanciasCreadas,error: out HayErrores,nombres: new string[] { \"Firstwindow\",\"2nd\",\"3rd\",\"4th\" });

            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(0),512,384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(1),384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(2),384,384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(3),384);

            for (int i = 0; i < n; i++) {
                // .....
                Application.Run(list.ElementAt<MyForm>(i));
            }           


            Console.ReadLine();
        }
    }
}
    

解决方法

        这是一个小样本。我正在使用一个接口来删除MainWindow和ChatWindows之间的耦合。
public class ChatEventArgs : EventArgs
{
    public string ChatEventArgs(string message)
    {
        Message = message;
    }

    public string Message { get; private set; }
}


public interface IChatMessageProvider
{
    event EventHandler<ChatEventArgs> MessageArrived;
    void TriggerEvent(object source,ChatEventArgs args);
}

public class MainWindow : IChatMessageProvider
{
    public event EventHandler<ChatEventArgs> MessageArrived = delegate{};

    public void AddChatWindow()
    {
        ChatWindow window = new ChatWindow(this);
        window.Show();
    }

    public void TriggerEvent(object source,ChatEventArgs args)
    {
        MessageArrived(source,args);
    }
}

public class ChatWindow : 
{
    IChatMessageProvider _provider;

    public ChatWindow(IChatMessageProvider provider)
    {
        _provider = provider;
        provider.MessageArrived += OnMessage;
    }


    public void OnMesage(object source,ChatEventArgs args)
    {
        // since we could have sent the message
        if (source == this)
            return;

        myListBox.Items.Add(args.Message);
    }

    public void SendButton_Click(object source,EventArgs e)
    {
        _provider.TriggerEvent(this,new ChatEventArgs(Textbox1.Text));
    }
}
    ,        实际上有多种方法可以做到这一点。 只需在Cliente上创建方法并从Prueba调用即可。这是最简单,最直观的解决方案。 将事件添加到Prueba,将Prueba的实例传递给Cliente,然后让Cliente注册到该事件。 使用某种全局静态Messenger类。使用事件或简单的消息传递。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。