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

 

posted @ 2022-02-05 23:07  sethnie  阅读(422)  评论(0编辑  收藏  举报