如何在C#中为new CheckBox()实例直接添加MouseDown事件?
问题原因说明
- 你在对象初始化器内注册事件报错,是因为C# 标准的对象初始化器语法仅支持设置类的属性、字段,不支持直接注册事件,这是语法层面的限制,所以会抛出
Invalid initializer member declarator错误。 - 你用
Controls.Find的写法失效有两个原因:- 你是在将CheckBox添加到
fp.Controls集合之前执行的检索,此时控件还没有加入控件树,自然找不到对应实例 - 你检索的是当前窗体的根控件集合
this.Controls,而你的CheckBox最终是添加到fp子容器中,哪怕添加完成后在根控件集合也检索不到该控件
- 你是在将CheckBox添加到
解决方案
方案1:拆分实例化步骤(全C#版本兼容,最推荐)
先创建CheckBox实例完成属性赋值,再注册事件,最后添加到FlowLayoutPanel中即可:
// 实例化控件并设置属性 CheckBox newCb = new CheckBox() { Name = "cb1", Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true }; // 注册MouseDown事件 newCb.MouseDown += cbox_MouseDown; // 添加到容器 fp.Controls.Add(newCb);
方案2:扩展方法实现流式调用(适合C# 9及以上版本)
如果你希望保持一行写完的写法,可以先写一个通用的控件扩展方法:
public static class ControlExtensions { public static T BindMouseDown<T>(this T control, MouseEventHandler handler) where T : Control { control.MouseDown += handler; return control; } }
之后就可以直接在实例化后链式调用绑定事件:
fp.Controls.Add(new CheckBox() { Name = "cb1", Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true }.BindMouseDown(cbox_MouseDown));
内容的提问来源于stack exchange,提问作者Mohammed Amine Belbachir
相关产品推荐
相关产品推荐

