C#窗口程序的控件如何触发容器的Click事件?

窗体上有很多控件,我要的效果是:无论单击哪个控件,Form的Click事件都被触发。

Form的Click事件可能绑定多个函数,是未定的。
1. 不要叫我直接调用Form_Click(sender, e)函数。因为绑定的函数是未定的。要的是触发Click事件,这样,不管绑定什么函数给Click事件,都可以全部执行。Button有个PerformClick方法可以达到类似的效果,但是Container没有。
2. 我不要替代的方法或者折衷的方法。
ct.Click += new EventHandler(Form1_Click);的方法肯定是不行的,我已经说过,“Form的Click事件可能绑定多个函数,是未定的。”无法确定是Form1_Click。另外,插件也可能有Form1.Click += 这样的代码,所以封装到 FormClick() 的方法也是不可行的。

我觉得有两种方式:
第一种:直接的就是foreach(Control ct in this.Controls)
ct.Click += new EventHandler(Form1_Click);
第二种:个人比较喜欢的就是自己开发各个类别的控件,比如textBox类别的控件,然后在这个控件里面定义一个click事件,把要调用的这个通用方法写进去,之后窗体上所有这个类别的控件都会调用这个事件了。不用一个一个绑定。其它类别的控件依次类推。就你用哪种了。
至于你说的performClick方法是为了解决这类问题:点击button2如何触发button1的点击事件?可以在button2的单击事件中加入button1.PreformClick();
解决这类问题还有其它方式,这只是其中的一种而已。
那就反过来写吧:
根据你的补充改成这样:
第一种:直接的就是foreach(Control ct in this.Controls)
{
form1.click+=new EventHandler("根据控件绑定方法名");
}
你这个只能一个个判断了,直接把控件的click绑定给form1.click是不行的,C#是不能这样做的,里面只能放方法的名字。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-23
尝试了一下,Form.MouseClick事件是无法和其它控件的Control.Click事件绑定的。这个方法基本不可行。
有以下两种办法:
1.将Form的单击事件执行的代码封装成方法,比如formClick(),任何需要单击控件的地方,直接调用此方法,也就相当于执行Form.MouseClick事件了。
2.重写窗体控件中的事件定义,直接System.EventHandler事件绑定,比如在按钮的事件绑定上写:this.btn.Click += new System.EventHandler(this.frmMain_Click);(按钮本身的事件不取消)。这种重写后的,只需要绑定窗体事件到按钮这些控件上,而不需要调用或单独触发。
foreach(Control ct in this.Controls)
ct.Click += new EventHandler(Form1_Click);
第2个回答  2013-04-25
有个建议:另外弄一个全通明,无边框的窗体form2,让这个form2一直出现在原窗体的上方并跟随移动,由于全透明,用户感觉不到form2的存在。但是所有的鼠标事件其实都发生在form2上,你可以在form2的mouse down里面处理
第3个回答  推荐于2018-05-11
foreach(Control ct in this.Controls)
ct.Click += new EventHandler(Form1_Click);本回答被网友采纳
第4个回答  推荐于2016-08-02
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{

}
private void button1_Click(object sender, EventArgs e)
{
Delegate[] _List = GetObjectEventList(this, "EventClick", typeof(Control));
foreach (var item in _List)
{
item.DynamicInvoke(sender, e);
}
}
public static Delegate[] GetObjectEventList(object p_Object, string p_EventName, Type p_EventType)
{
PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
if (_PropertyInfo != null)
{
object _EventList = _PropertyInfo.GetValue(p_Object, null);
if (_EventList != null && _EventList is EventHandlerList)
{
EventHandlerList _List = (EventHandlerList)_EventList;
FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
if (_FieldInfo == null) return null;
Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
if (_ObjectDelegate == null) return null;
return _ObjectDelegate.GetInvocationList();
}
}
return null;
}
private void Form1_Click(object sender, EventArgs e)
{
MessageBox.Show("aaaaaaa");
}
}
}

本回答被提问者采纳

C#窗口程序的控件如何触发容器的Click事件?
第一种:直接的就是foreach(Control ct in this.Controls)ct.Click += new EventHandler(Form1_Click);第二种:个人比较喜欢的就是自己开发各个类别的控件,比如textBox类别的控件,然后在这个控件里面定义一个click事件,把要调用的这个通用方法写进去,之后窗体上所有这个类别的控件都会调用这个事件了。

C#中,学习一个控件的使用要从那几个方面入手?以Button控件的使用为...
IsMirrored 获取一个值,该值指示此控件是否为镜像控件。 (继承自 Control。) LayoutEngine 获取控件的布局引擎的缓存实例。 (继承自 Control。) Left 获取或设置控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 (继承自 Control。) Location 获取或设置该控件的左上角相对于其容器的左上角的坐标。 (...

C#动态添加的控件准备完毕触发什么事件?
private void button1_Click(object sender, EventArgs e){ \/\/ 向窗体添加一个文本框 TextBox tb = new TextBox(); addCon(tb);}\/\/ addCon方法修改如下private void addCon(Control con){ if (con is TextBox) { TextBox textBox = con as TextBox; textBox.Multiline...

c#:winform如何让一堆控件平时隐藏,在点击触发时才 显示出来?如图。
每个控件都有一个属性值Visibility是控制这个,有三个属性值,Visible是默认属性值可见的,Hidden是隐藏不占空间,如果是个button控件就不能点击,collapsed是隐藏但是占空间,如果是个button控件就依旧可以在那个位置点击但是看不见,只需创建个事件控制这个属性值就可以达到你要的效果了 ...

C#中控件的Click事件与MouseClick事件有什么区别?
click是激活,包含了MouseClick,MouseClick是鼠标点击click不只是鼠标点击,当焦点在该控件上,按回车时也激发此事件MouseClick应该有鼠标点击坐标属性成员 本回答由提问者推荐 举报| 答案纠错 | 评论(2) 26 2 司馬尘恋 采纳率:58% 来自团队:程序设计研究 擅长: 编程语言 游戏 为...

C#程序:实现窗体和控件的自由缩放的代码或属性
这个简单:首先点击你窗体中的控件,看属性栏找布局里的Anchor 改属性:Top,Bottom变成 Top,Bottom,Left,Right。

在C#winform中如何遍历子窗体中有容器中的所有的控件
一个递归方法取得页面上所有类型为textbox的控件,并对其清空,相信你看了后有所感悟。private void Button1_Click(object sender, System.EventArgs e){ foreach (Control ctl in this.Controls){ this.txtClear(ctl);} } private void txtClear(Control ctls){ if(ctls.HasControls()){ foreach...

C#中,System.ComponentModel.Container详解
在实际应用中,通常在使用控件时,会将其添加到容器中。这样做既方便了对控件的管理,也便于进行批量操作。容器还支持事件管理,当容器中的零件发生事件时,容器会触发相应的事件,允许其他零件作出相应反应。这种特性有助于建立零件之间的复杂关系。在窗体应用程序中,容器通常在窗体构造函数中创建。将控件...

用C# winForm,一个pannel容器上有许多label,怎样才能使得鼠标点击label时...
1.捕捉Label的点击事件然后直接调用panel的事件处理函数;2.或重写Panel控件为自己的,捕捉label的事件然后调用基类的 OnClick。

c#用户控件的使用
用户控件里,直接调用即可,参考如下:usercontrol.ascx.cs中的处理:1. 定义public的事件委托,如clickeventhandler;2. 在usercontrol类中声明事件,如click;3. 在usercontrol类中定义引发事件的方法,如onclick()方法;4. 在usercontrol类的相关方法中调用引发事件的方法,如在button_click(...

相似回答