Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件处理程序&;代表(简单问题)_C#_.net_C# 4.0 - Fatal编程技术网

C# 事件处理程序&;代表(简单问题)

C# 事件处理程序&;代表(简单问题),c#,.net,c#-4.0,C#,.net,C# 4.0,我有一个简单的应用程序。下面是它的工作原理。我有一个从Windows.Forms继承的类(MyForm)。它有一个按钮、一个标签和一个文本框。它看起来像一个聊天窗口。 还有一个类(Cliente)接受一个字符串数组,它返回一个列表,其中包含数组中每个元素的MyForm实例 我有第三个类(Prueba),它使用前两个类来测试它们。此类创建并显示MyForm的四个实例。(我将省略一些代码和功能,因为我知道它工作正常。) 我需要能够在一个窗口中键入一些内容,当单击按钮时,它将广播此消息并在所有其他窗口

我有一个简单的应用程序。下面是它的工作原理。我有一个从Windows.Forms继承的类(MyForm)。它有一个按钮、一个标签和一个文本框。它看起来像一个聊天窗口。 还有一个类(Cliente)接受一个字符串数组,它返回一个列表,其中包含数组中每个元素的MyForm实例

我有第三个类(Prueba),它使用前两个类来测试它们。此类创建并显示MyForm的四个实例。(我将省略一些代码和功能,因为我知道它工作正常。)

我需要能够在一个窗口中键入一些内容,当单击按钮时,它将广播此消息并在所有其他窗口中显示它。 我知道我必须使用事件处理程序和委托,但是在到处看了几个小时的教程之后,我不知道应该把什么放在哪里

你能帮帮我吗?如果你能给我一个好的教程或例子就足够了,但如果你能更具体地介绍我的代码,那就太好了

(我不知道如何让MyForm的一个实例知道其他实例,谁应该是这里的侦听器?我在想那个客户机,但我不知道怎么做。) 任何帮助都将不胜感激

    //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), 0, 0, 512, 384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(1), 512, 0, 512, 384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(2), 0, 384, 512, 384);
            cliente.ModificarPosicionYMedidas(list.ElementAt<MyForm>(3), 512, 384, 512, 384);

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


            Console.ReadLine();
        }
    }
}
//MyForm
名称空间Dia26{
//公共委托void changedventhadler(对象发送方,事件参数e);
公共类MyForm:System.Windows.Forms.Form{
公共按钮btn=新按钮();
public TextBox TextBox=new TextBox();
公共标签=新标签();
公共按钮btnEnviar=新按钮();
公共委托void OwnerChangedEventHandler(字符串newOwner)//~
公共活动所有者发生变更;管理者所有者发生变更;
受保护的无效btn_单击(对象发送者,System.EventArgs e){
这个。关闭();
}
受保护的无效Btneviar_单击(对象发送者,System.EventArgs e){
label.Text+=textbox.Text+“\n”;
textbox.Text=”“;
if(this.OwnerChanged!=null){
这个。所有者改变了(什么?);
}
}
公共MyForm(){
btn.Text=“cerrar”;
btn.左=400;
btn.Top=280;
btn.Click+=新建事件处理程序(此.btn\u单击);
btnEnviar.Click+=新建事件处理程序(此.btnEnviar\u单击);
textbox.Left=15;
textbox.Top=20;
textbox.Width=330;
左=15;
标签。顶部=50;
label.AutoSize=false;
标签高度=210;
标签宽度=450;
label.BackColor=Color.White;
btnEnviar.左=350;
btnEnviar.Top=17;
btnEnviar.Text=“Enviar”;
this.Controls.Add(文本框);
this.Controls.Add(标签);
this.Controls.Add(btn);
this.Controls.Add(btnEnviar);
这个.SuspendLayout();
this.Name=“MyForm”;
此选项为.resume布局(false);
返回;
}
}
}
//Cliente.cs
命名空间Dia26Prueba{
公共类客户{
克里亚达斯公共图书馆;
公共互联网阅读器;
公共列表MostrarVentanas(输出布尔错误,引用int creadas,参数字符串[]nombres){
列表=新列表();
int bienCreadas=0;
foreach(字符串str,名称){
如果(str.Length>=1){
MyForm mf=新的MyForm();
mf.Text=str;
//mf.OwnerChanged+=新所有者变更开发者(mf_OwnerChanged);
列表。添加(mf);
mf.Show();
bienCreadas++;
}
}
错误=(bienCreadas==creadas);
nocreadas=bienCreadas-creadas;
creadas=两个副本;
退货清单;
}
公共void ModificarPosicionYMedidas(MyForm mf,int x=262,int y=209,int width=500,int height=350){
mf.Left=x;
mf.Top=y;
mf.宽度=宽度;
mf.高度=高度;
}
}
}
//普鲁巴
名称空间Dia29{
普鲁巴类{
静态void Main(字符串[]参数){
Cliente Cliente=新客户();
int n=4;
Console.WriteLine(cliente.Autor);
如果(args.Length!=n){
返回;
}
int InstanciasCreadas=n;
布尔·哈耶雷斯;
名单;
列表=cliente.MostrarVentanas(
creadas:ref InstanciasCreadas,
错误:出Hayerrors,
名称:新字符串[]{“第一个窗口”、“第二个”、“第三个”、“第四个”});
客户。修改的主题名称(列表。元素位于(0),0,0,512,384);
客户。修改的主题名称(列表。元素位于(1),512,0,512,384);
修改后的客户名称(列表元素编号(2),0384512,384);
修改后的客户名称(列表。元素地址(3),512,384,512,384);
对于(int i=0;i
实际上有多种方法可以做到这一点

  • 只需在客户机上创建方法并从Prueba调用它。这是最简单、最直观的解决方案
  • 将事件添加到Prueba,将Prueba实例传递给客户端,并让客户端注册到此事件
  • 使用某种全局静态messenger类。使用事件或简单的消息传递

    • 这是一个小样本。我正在使用一个接口来移除主窗口和聊天窗口之间的耦合

      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));
          }
      }
      
      公共C类