C# 使用事件获取另一个 Form 中的数据,设计 Form 类型的弹窗
设计背景:
几个关键点围成一个多边形,并对多边形进行命名,但是不能与其他多边形名称重合。
FormMain:形成多边形,启动弹窗(FormAddFence)提示修改名称,如果名称与之前存在的多边形名称重复,则提示修改,否则返回 DialogResult.OK ,并通过事件形式修改FormMain中的变量。
FormMain:
// 创建一个事件的publish
MyEventPublish myEventPublish = new MyEventPublish();
// 创建弹窗
Form formAddFence = new FormAddFence(fencesConfigFile, myEventPublish);
// 把事件注册上,弹窗中发布事件,主窗口getName() 方法会执行
myEventPublish.MyEvent += getName;
// 显示弹窗
if (formAddFence.ShowDialog().Equals(DialogResult.OK))
{
//(窗口返回 DialogResult.OK ,这种方式在弹窗中会介绍)
// 弹窗返回ok,认为在弹窗中的操作是预期的正确操作,一下是处理过程
}
弹窗:
启动弹窗(FormAddFence)效果:

按下确认键,会判断名称是否重复,如果重复,会弹出 MessageBox 提示

代码:
namespace GeoFence
{
public partial class FormAddFence : Form
{
// 窗口关闭后返回的结果,默认是Cancel
DialogResult result = DialogResult.Cancel;
// 我需要对比的源数据
List<Fence> fencesConfigFile = null;
// 定义事件的发布,从主窗口接收
MyEventPublish myEventPublish = null;
public FormAddFence(List<Fence> fences,MyEventPublish p)
{
InitializeComponent();
fencesConfigFile = new List<Fence>(fences);
myEventPublish = p;
}
private void FormAddFence_FormClosing(object sender, FormClosingEventArgs e)
{
// 窗口关闭之前,更新结果,必要操作
this.DialogResult = result;
}
// 确认按键
private void buttonAdd_Click(object sender, EventArgs e)
{
// 去除多余的空格
string name = textBoxFenceName.Text.Replace(" ", "");
// 交叉比对
foreach (Fence f in fencesConfigFile)
{
// 已经有这个名称
if (f.Name.Equals(name))
{
MessageBox.Show("存在相同名称,请修改!", " 提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
// 名称符合条件
result = DialogResult.OK;
if (myEventPublish != null)
{
// 通过事件,使得 FormMain 中注册的 getName() 执行
myEventPublish.Send(name);
}
// 自动关闭窗口
this.Close();
}
}
}
事件发布者类:
public class MyEventPublish { public event Action<string> MyEvent; public void Send(string str) { if (MyEvent != null) { MyEvent(str); } } }
浙公网安备 33010602011771号