Winform两个窗体相互传递数据自己造轮子

1、假如我们现在有两个窗体
MainForm和SubForm
MainForm放置一个TextBox和一个Button
SubForm放置一个TextBox和两个Button
点击主界面,打开新窗体,并且将主窗体的数据传递过去
最基本的通信就是主窗体和子窗体都有一个属性当作中转,这种我们不介绍,我们来自己手动造轮子
一、使用ConcurrentDictionary
直接上代码

 /// <summary>
 /// 简单的数据传递,ConcurrentDictionary 是线程安全的,可以在多线程使用
 /// 但是要知道执行顺序,先写入,在读取
 /// </summary>
 public static class ChannelEvent
 {
     private static readonly ConcurrentDictionary<string, string> _localValues = new ConcurrentDictionary<string, string>();

     public static void SetLocalValue(string name, string value)
     {
         _localValues[name] = value;
     }

     public static string GetLocalValue(string name)
     {
         _localValues.TryGetValue(name, out var value);
         return value;
     }
 }

 public class WriteEvent
 {
     public static void Write(string key,string value)
     {
         ChannelEvent.SetLocalValue(key, value);
     }
 }

 public class ReadEvent
 {
     public static string Read(string key)
     {
         var value = ChannelEvent.GetLocalValue(key);
         return value;
     }
 }

然后我们在主界面的Button_CLick写

 private void Button_Click(object sender, EventArgs e)
 {
     WriteEvent.Write("001", "HelloWorld");     //自己写的跨线程传值
     SubForm subForm = new SubForm();
     DialogResult result = subForm.ShowDialog(); // 显示子窗体并等待用户操作
 }

在子界面写

 ReadEvent.Read("001");

二、在我之前讲解WPF的时候,我们了解到Prism框架,它内部的DialogParameters和IDialogService就是一个很好的例子,我们可以仿照

 public class DialogContext
 {
     private Dictionary<string, object> _parameters = new Dictionary<string, object>();

     public void Add<T>(string key, T value)
     {
         _parameters[key] = value;
     }

     public T Get<T>(string key)
     {
         if (_parameters.TryGetValue(key, out var value))
         {
             return (T)value;
         }
         return default(T);
     }
 }

然后我们主界面可以写

 private void Button_Click(object sender, EventArgs e)
 {
    DialogContext context= new DialogContext();
    context.Add("002","HelloWorld");
    SubForm subForm = new SubForm();
    DialogResult result = subForm.ShowDialog(context); // 显示子窗体并等待用户操作
 }

我们重写子界面的ShowDialog方法

 public DialogResult ShowDialog(DialogContext context)
 {
     uiTextBox1.Text =context.Get<string>("002");
     return base.ShowDialog();
 }

但是Prism框架是可以窗体方法的,我们也可以模仿
将父窗体的方法在子窗体使用
继续扩展

 public class DialogContext
 {
     private Dictionary<string, object> _parameters = new Dictionary<string, object>();
     private Dictionary<string, Action> _commands = new Dictionary<string, Action>();
     public void Add<T>(string key, T value)
     {
         _parameters[key] = value;
     }

     public T Get<T>(string key)
     {
         if (_parameters.TryGetValue(key, out var value))
         {
             return (T)value;
         }
         return default(T);
     }

     public void AddCommand(string key, Action command)
     {
         _commands[key] = command;
     }

     public void ExecuteCommand(string key)
     {
         if (_commands.TryGetValue(key, out var command) && command != null)
         {
             command.Invoke();
         }
     }
 }

我们在MainForm写一个测试方法

 public void Method()
 {
     MessageBox.Show("打开子窗体");
 }

和刚才一样传递进去

 DialogContext context = new DialogContext();
 context.AddCommand("Method", Method);
 RunningForm subForm = new RunningForm();
 DialogResult result = subForm.ShowDialog(context); 

接着在子窗体使用

  public DialogResult ShowDialog(DialogContext context)
  {
      context.ExecuteCommand("Method");
      return base.ShowDialog();
  }
posted @ 2024-05-18 16:39  孤沉  阅读(208)  评论(0编辑  收藏  举报