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();
}