设计背景:
几个关键点围成一个多边形,并对多边形进行命名,但是不能与其他多边形名称重合。
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); } } }