请问怎么根据事件名对一个控件动态的去删除/增加事件

cansum396 2019-06-08 06:22:51
也可以这么理解为一个开关
在满足特定条件时,这个控件的事件被删除
又或在满足另一条件时,这个控件的事件被添加进来
...全文
93 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-06-12
  • 打赏
  • 举报
回复
Rx.net 你可以拥有 可以写一个通用方法,把事件变成一个可观测源。 然后你想用就用,不想用不用dispose 这个通用方法我就不写了,就用rx.net自己带的方法展示一下 //把button1的click事件变成一个可观测流 var clickedStream = Observable.FromEventPattern<EventArgs>(button1, "Click"); 你前面说假设有个变量a,我们就假设变量a为1我需要监听button1的事件,变量为2我不要订阅 为了方便,我打算把这个变量监控也变成可观测流。 Subject<int> a=new Subject<int> (); 好了这就行了 //如果a==1,订阅那个事件 a.where(p=>p==1).Subscribe(p=>{ //订阅那个事件,直到p==2为至,这个其实是个Idispose对象,如果不用了直接dispose他就好,我这里只是展示一下rx的类似linq的条件使用 clickedStream.until(a.where(p=>p==2)).Subscribe(e=>{//事件处理 }) }); ---------------- 这里只是简单展示一下,rx的使用。rx使用还是挺有意思的。不过估计得要玩一段时间才能比较顺手,毕竟就是当初linq出来,也不是所有人都一下能接受
bloodish 2019-06-12
  • 打赏
  • 举报
回复

public class MyControl
    {
        public event EventHandler Event1;
        public event EventHandler<EventArgs> Event2;

        public void AddEvent(string eventName, Delegate handler)           
            =>GetType().GetEvent(eventName)?.AddEventHandler(this, handler);

        public void RemoveEvent(string eventName, Delegate handler)
            => GetType().GetEvent(eventName)?.RemoveEventHandler(this, handler);
    }

    class Program
    {
        static void Main(string[] args)
        {
            var mc = new MyControl();            

            var eventHandler1 = new EventHandler((s, e) => { });
            var eventHanlder2 = new EventHandler<EventArgs>((s, e) => { });
            
            mc.AddEvent("Event1", eventHandler1);
            mc.AddEvent("Event2", eventHanlder2);

            mc.RemoveEvent("Event1", eventHandler1);
            mc.RemoveEvent("Event2", eventHanlder2);
        }
    }
秋的红果实 2019-06-08
  • 打赏
  • 举报
回复
能否举例说明下
threenewbee 2019-06-08
  • 打赏
  • 举报
回复
动态的用反射。给你的代码里有RemoveEventHandler,你举一反三下,AddEventHandler不会么
cansum396 2019-06-08
  • 打赏
  • 举报
回复
引用 7 楼 秋的红果实 的回复:
winForm下

private void Form1_Load(object sender, EventArgs e)
{
    bool turnOn = true;
    if(turnOn)
    {
        button1.Click += new EventHandler((o,ev)=>
        {
            //do something
        });
        turnOn = false;

    }
    else
    {
        button1.Click -= new EventHandler((o,ev)=>
        {
            //do something
        });
        turnOn = true;

    }
}

我的要求是事件名与控件名都是动态的
秋的红果实 2019-06-08
  • 打赏
  • 举报
回复
winForm下

private void Form1_Load(object sender, EventArgs e)
{
    bool turnOn = true;
    if(turnOn)
    {
        button1.Click += new EventHandler((o,ev)=>
        {
            //do something
        });
        turnOn = false;

    }
    else
    {
        button1.Click -= new EventHandler((o,ev)=>
        {
            //do something
        });
        turnOn = true;

    }
}

cansum396 2019-06-08
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
[quote=引用 4 楼 cansum396 的回复:] [quote=引用 3 楼 caozhy 的回复:] [quote=引用 2 楼 cansum396 的回复:] [quote=引用 1 楼 caozhy 的回复:] 反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
增加事件呢?[/quote] 控件.事件 += new XXXEventHandler(事件处理程序)[/quote] 我要的是control和evenname都是动态的[/quote] 那就用反射[/quote] 我知道用反射
threenewbee 2019-06-08
  • 打赏
  • 举报
回复
引用 4 楼 cansum396 的回复:
[quote=引用 3 楼 caozhy 的回复:] [quote=引用 2 楼 cansum396 的回复:] [quote=引用 1 楼 caozhy 的回复:] 反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
增加事件呢?[/quote] 控件.事件 += new XXXEventHandler(事件处理程序)[/quote] 我要的是control和evenname都是动态的[/quote] 那就用反射
cansum396 2019-06-08
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
[quote=引用 2 楼 cansum396 的回复:] [quote=引用 1 楼 caozhy 的回复:] 反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
增加事件呢?[/quote] 控件.事件 += new XXXEventHandler(事件处理程序)[/quote] 我要的是control和evenname都是动态的
threenewbee 2019-06-08
  • 打赏
  • 举报
回复
引用 2 楼 cansum396 的回复:
[quote=引用 1 楼 caozhy 的回复:] 反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
增加事件呢?[/quote] 控件.事件 += new XXXEventHandler(事件处理程序)
cansum396 2019-06-08
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
增加事件呢?
threenewbee 2019-06-08
  • 打赏
  • 举报
回复
反射 https://blog.csdn.net/jiaoshiyao/article/details/12091565
version :4.0 1、将生成的代码和事件用两个文件实现。 2、修改了部分Bug; 3、颜色设置做了部分改进; 4、内部集成了VC的编译器,和模拟器,生成C文件后可以直接在uCGUIBuilder中编译,运行模拟器了 5、添加代码自动完成功能; 6、添加画线功能。 version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件错误的Bug; 4、添加了控件ID自动增加功能; 5、添加了控件ID检查功能,控件ID有重复时会有警告; 6、添加了用户自定义字体功能; 7、支持中英文切换(但功能不够完善); 8、支持自动检查更新; 9、修改了不能保存用户自定义ID的BUG; version : 3.0.0.0 重写了部分内核,运行更稳定; 支持窗体设计器的复制、粘贴、剪切、删除、撤销、等基本操作; 支持多控件,对齐、公共属性修改等基本操作; 支持将.ucfrm文件与ucGUIBuilder关联功能; 支持控件自定义ID; 添加了窗体预览功能; 添加了对控件事件的支持; 添加了在线检查更新功能; 等…… version : 2.1.0.5 优化了控件库; 修复了一些Bug; 代码生成窗口中添加了C语言语法高亮显示功能; C文件模板做了部分修改(C文件模板大家可以随意修改为自己喜欢的格式(..\Template\Template.c文件) 但是要保证$$$GUI_WIDGET_CREATE_INFO$$$ $$$Defination$$$ $$$InitDialog$$$ 三个字符串位置不变) 支持设计的窗体保存为文件,并可以打开; 对所有控件属性添加了Description(在属性窗口最下面显示); 窗体布局可以保存,可以自定义为自己喜欢的窗体布局; 修改了部分功能; version : 2.0.0.5 优化了控件库; 修复了一些Bug; 可以生成完整的C文件(包括 资源表,初始化代码等); 修改了部分功能; version : 1.0.0.0 功能很不完善; 还有好多BUG; 目前只能生成资源表; 暂时不能生成其他代码; 大家有什么好的建议可以发送Email 到: ucguibuilder@163.com

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧