C#窗口程序的控件如何触发容器的Click事件?
窗体上有很多控件,我要的效果是:无论单击哪个控件,Form的Click事件都被触发。Form的Click事件可能绑定多个函数,是未定的。1.不要叫我直接调用Form_Cl...
窗体上有很多控件,我要的效果是:无论单击哪个控件,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() 的方法也是不可行的。 展开
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() 的方法也是不可行的。 展开
6个回答
展开全部
我觉得有两种方式:
第一种:直接的就是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#是不能这样做的,里面只能放方法的名字。
第一种:直接的就是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#是不能这样做的,里面只能放方法的名字。
展开全部
尝试了一下,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);
有以下两种办法:
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);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有个建议:另外弄一个全通明,无边框的窗体form2,让这个form2一直出现在原窗体的上方并跟随移动,由于全透明,用户感觉不到form2的存在。但是所有的鼠标事件其实都发生在form2上,你可以在form2的mouse down里面处理
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
foreach(Control ct in this.Controls)
ct.Click += new EventHandler(Form1_Click);
ct.Click += new EventHandler(Form1_Click);
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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");
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询