C#父窗体监听子窗体事件&C#子窗体产生事件给父窗体&父窗体触发子窗体的事件&父窗体中处理子窗体控件的事件&C#使用自定义的事件委托传递消息

C#父窗体监听子窗体事件或在父窗体中处理子窗体控件的事件


前言

在C#程序编写过程中,我们可能会遇到子窗体点了一下按钮,或者勾选了个复选框
想让其在父窗体中处理这个事件的问题。

虽然可以通过直接将子窗体的控件变为公有属性,这样就可以直接在父窗体中绑定上这个事件。但是!!!

如果业务变得复杂,这种问题变多了,会让我们的代码耦合度非常高,可读性也会变得很差。


使用默认事件委托

子窗体代码演示

在这种情况下,我们便可以通过事件委托将这个事件抛出来达到这个目的。
下面上代码演示:

        private CheckBox[] checkboxes;//我这里有若干个控件,我希望不管勾选哪个控件父窗体都能捕获到这个事件

        public event EventHandler CANCheckedChanged;//用于抛出某个CANID选中状态改变的事件,用于父类调用
        public SelectBox()
        {
            InitializeComponent();
            checkboxes = new CheckBox[10];//这里把控件数组初始化,现在只是数组初始化完成,数组里面的对象还是空的哦
            for (int i = 0; i < checkboxes.Length; i++)
            {
                checkboxes[i] = new CheckBox();
                checkboxes[i].CheckedChanged += new EventHandler(checkBoxChild_CheckedChanged);//这里将事件绑定到子窗体中的一个函数上,再通过这个函数将事件抛出给父窗体
            }
        }
        //当某个CANID选中状态改变时抛出该事件
        //这个函数用来接收这若干个CheckBox的事件,所以参数需要和系统委托保持一致
        private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
        {
            //利用我们自己定义的委托将这个事件抛出
            CANCheckedChanged.Invoke(sender, e);
        }

父窗体使用方法

      //初始化子窗体时将子窗体声明的事件委托绑定到一个处理函数上
      Form selectBox = new Form();
      selectBox.CANCheckedChanged += new EventHandler(checkBoxChild_CheckedChanged);
//这里是父窗体的处理函数,也就是上面绑定的函数
        private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
        {
            if (((CheckBox)sender).Checked)
                MessageBox.Show("子窗体控件被勾选了");
            else
                MessageBox.Show("子窗体控件被取消勾选了");
        }

使用自定义的事件委托

这里作者并没有实际测试使用过,只是突然奇思妙想,如果有误请联系作者删除

子窗体代码演示

//跟上面使用默认的事件委托差不多,只不过这次我们自己声明一个
        public delegate void MyEvent(int 参数1, string 参数2, object 参数3);//如果需要自定义数据可以使用自定义的委托
        public event MyEvent myEventChanged;//将上面的委托声明一个委托事件
//然后像上面一样绑定上控件的事件


//当某个CANID选中状态改变时抛出该事件
        private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
        {
            myEventChanged.Invoke(1, "2", sender);//这时候就可以抛出我们的自定义事件
        }

父窗体使用方法

      //初始化子窗体时将子窗体声明的事件委托绑定到一个处理函数上
      Form selectBox = new Form();
      selectBox.myEventChanged += new SelectBox.MyEvent(CheckedChanged);//SelectBox是子窗体的类名,这样才可以找到我们自定义的委托
//使用的时候参数与上面定义的参数保持一致就可以了
        public void CheckedChanged(int 参数1, string 参数2, object 参数3)
        {
            //处理这个事件的代码
        }

总结

以上就是关于C#父窗体监听子窗体事件的内容了,如果您觉得这篇文章有误,请您指正批评,作者将感激不尽!
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Vue 组件可以通过 `ref` 属性获取到组件的实例,然后就可以通过组件实例上的方法或属性来操作组件了。 假设组件是一个弹窗组件,那么可以在组件监听组件的某个事件(如关闭事件),然后调用组件的方法来关闭弹窗。 下面是一个示例代码: ```html <!-- 组件 --> <template> <div> <button @click="showDialog">打开弹窗</button> <dialog ref="dialog"></dialog> </div> </template> <script> import Dialog from './Dialog.vue' export default { components: { Dialog }, methods: { showDialog() { this.$refs.dialog.open() // 调用组件的方法打开弹窗 }, closeDialog() { this.$refs.dialog.close() // 调用组件的方法关闭弹窗 } }, mounted() { // 监听组件的关闭事件 this.$refs.dialog.$on('close', () => { this.closeDialog() }) } } </script> ``` 在组件,可以通过 `$emit` 方法触发事件,从而通知组件做出相应的处理。例如,当点击弹窗的关闭按钮时,可以触发一个 `close` 事件,让组件调用关闭弹窗的方法。 下面是组件的示例代码: ```html <!-- 组件 --> <template> <div v-if="visible"> <div class="dialog-mask"></div> <div class="dialog-content"> <div class="dialog-header"> <h3>{{ title }}</h3> <button @click="close">关闭</button> </div> <div class="dialog-body"> <slot></slot> </div> </div> </div> </template> <script> export default { props: { title: String }, data() { return { visible: false } }, methods: { open() { this.visible = true }, close() { this.visible = false this.$emit('close') // 触发关闭事件 } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值