根据控件名称,调用相应的Click事件

sunylf 2013-07-20 09:59:47
1. private void lblBtn1_Click(object sender, EventArgs e)
{
//程序响应
}

2. private void imgBtn1_Click(object sender, EventArgs e)
{
string sName = ((PictureBox)sender).Name;
sName = sName.Replace("img", "lbl");

***问题是,如何实现下面的功能?不要直接用下面语句,因为有很多类似的名称要实现此功能,不想一一拼写。比如lblBtn1对应imgBtn1,lblBtn2对应imgBtn2.......n对n,等等 
//lblBtn1_Click(sender, e);
}
...全文
459 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
leeya66 2013-07-22
  • 打赏
  • 举报
回复
用委托 初学还是建议老老实实写代码 多一点就多一点,容易维护
sunylf 2013-07-22
  • 打赏
  • 举报
回复
引用
引用 29 楼 xiaozhi_5638 的回复: 注册所有的picturebox控件的Click事件 用同一个事件处理程序 picturebox1.Click+=img_Click; picturebox2.Click+=img_Click; picturebox3.Click+=img_Click; private void img_Click(object sender,EventArgs e) { string name = (sender as PictureBox).Name; DoSomething(name); } private void DoSomething(string imgName) { switch(imgName) //根据点击PictureBox 做出相应反应 { // ... //把你写在lblBtn1_Click()、lblBtn2_Click、lblBtn3_Click 中的逻辑写在这里 } }
这个已能实现我上面提出的功能, 但有另一需求,即鼠标移到图片上,其下面的Label标签颜色跟着改变,要如何简单实现呢? 不想通过控件循环查找的功能来实现!!! 也就是,通过一个图片名称(或控件名称),返回一个对应的Label的,好对相应的Label做相应的处理,如:Click事件,改变颜色等等。
sunylf 2013-07-22
  • 打赏
  • 举报
回复
引用
/// <summary> /// 根据控件Name调用自身Click事件 /// </summary> /// <param name="controlName">控件Name</param> public void CallOnClick(string controlName) { if (this.Controls.ContainsKey(controlName)) { object o = this.Controls[controlName];  //(1) object[] p = new object[1]; p[0] = EventArgs.Empty; Type t = o.GetType(); MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); m.Invoke(o, p); } }
经测试,程序根本就没能进入执行if语句(即(1)处)。 我输入的参数是Label的名称。难道一定要传Button的名称才可以么? 还是没能达到目的。
wyjfed24 2013-07-22
  • 打赏
  • 举报
回复
引用 34 楼 wyjfed24 的回复:
[quote=引用 31 楼 sunylf 的回复:]
引用
/// <summary> /// 根据控件Name调用自身Click事件 /// </summary> /// <param name="controlName">控件Name</param> public void CallOnClick(string controlName) { if (this.Controls.ContainsKey(controlName)) { object o = this.Controls[controlName];  //(1) object[] p = new object[1]; p[0] = EventArgs.Empty; Type t = o.GetType(); MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); m.Invoke(o, p); } }
经测试,程序根本就没能进入执行if语句(即(1)处)。 我输入的参数是Label的名称。难道一定要传Button的名称才可以么? 还是没能达到目的。
你对label是不是放在groupbox里了,(1)处的this代表的是主窗体对象,如果label在其他容器里面这里需要用该容器.Controls[labelID]来获取label对象。[/quote] /// <summary> /// 根据控件Name调用自身Click事件 /// </summary> /// <param name="container">容器</param> /// <param name="controlName">控件Name</param> public void CallOnClick(Control container, string controlName) { if (container.Controls.ContainsKey(controlName)) { object o = container.Controls[controlName]; object[] p = new object[1]; p[0] = EventArgs.Empty; Type t = o.GetType(); MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); m.Invoke(o, p); } } 小改了下,增加了一个容器的参数,看你之前的代码有这一段: foreach (Control label1 in (panelMain.Controls)) 就是说你的label都放在panelMain这个容器里的。 调用的时候就直接CallOnClick(panelMain,"label1");如果控件是放在form里的,那么就CallOnClick(this,"label1");这么调用。
wyjfed24 2013-07-22
  • 打赏
  • 举报
回复
引用 31 楼 sunylf 的回复:
引用
/// <summary> /// 根据控件Name调用自身Click事件 /// </summary> /// <param name="controlName">控件Name</param> public void CallOnClick(string controlName) { if (this.Controls.ContainsKey(controlName)) { object o = this.Controls[controlName];  //(1) object[] p = new object[1]; p[0] = EventArgs.Empty; Type t = o.GetType(); MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); m.Invoke(o, p); } }
经测试,程序根本就没能进入执行if语句(即(1)处)。 我输入的参数是Label的名称。难道一定要传Button的名称才可以么? 还是没能达到目的。
你对label是不是放在groupbox里了,(1)处的this代表的是主窗体对象,如果label在其他容器里面这里需要用该容器.Controls[labelID]来获取label对象。
Code従業員 2013-07-21
  • 打赏
  • 举报
回复
关于题目,我有点不明白,有两个疑问,望解答:

1、控件执行的点击操作是否都是达到同一效果,如果都是相同操作,所有控件加入同一事件即可;
如果是不同的处理,那请问你,这些不同的代码应该写在哪?
特别是那些一一对应的事件,用VS自带的事件不是更好?
2、上例看到,反正你也需要一个控件一个事件,将程序本身内聚性很强地指向,改成这样高耦合的
“匹配”方式是不是逻辑“倒退”了,有什么现实意义?
请叫我卷福 2013-07-21
  • 打赏
  • 举报
回复
引用 19 楼 sunylf 的回复:
xiaozhi_5638 调用语句出错了,不知什么原因???
不是有提示吗 Controls集合中都是 Control类型 当然要转换一下 foreach(Control label in panel1.Controls) { if(label is MyLabel && label.Name == strName) { MyLabel myLabel = label as MyLabel; myLabel.InvokeClick(); break; } } 其实问题说白了 要解决的 就是不通过鼠标点击 怎么在Label外部 激发Label的Click事件
代码裁缝 2013-07-21
  • 打赏
  • 举报
回复
引用 29 楼 xiaozhi_5638 的回复:
注册所有的picturebox控件的Click事件 用同一个事件处理程序 picturebox1.Click+=img_Click; picturebox2.Click+=img_Click; picturebox3.Click+=img_Click; private void img_Click(object sender,EventArgs e) { string name = (sender as PictureBox).Name; DoSomething(name); } private void DoSomething(string imgName) { switch(imgName) //根据点击PictureBox 做出相应反应 { // ... //把你写在lblBtn1_Click()、lblBtn2_Click、lblBtn3_Click 中的逻辑写在这里 } } 楼上几位大神 说得有道理 由于具体需求不清楚 楼主可以参考该回帖
我也只能想到这样,我认为是正解. 为了你少走弯路,仔细的看下事件和委托 public event EventHandler ExeNew; public event EventHandler ExeUpdate; public event EventHandler ExeDelete; public event EventHandler ExeSave; public event EventHandler ExeEsc; public event EventHandler ExeFind; tsb_Save.Click += new System.EventHandler(Tsb_Click); tsb_Esc.Click += new System.EventHandler(Tsb_Click); tsb_New.Click += new System.EventHandler(Tsb_Click); tsb_Update.Click += new System.EventHandler(Tsb_Click); tsb_Delete.Click += new System.EventHandler(Tsb_Click); tsb_Find.Click += new System.EventHandler(Tsb_Click); private void Tsb_Click(object sender, EventArgs e) { ToolStripButton tsb = (ToolStripButton)sender; switch (tsb.Name) { case "tsb_New": if (ExeNew != null) { ExeNew(sender, e); } break; case "tsb_Update": if (ExeUpdate != null) { ExeUpdate(sender, e); } break; case "tsb_Delete": if (ExeDelete != null) { ExeDelete(sender, e); } break; case "tsb_Save": if (ExeSave != null) { ExeSave(sender, e); } break; case "tsb_Esc": if (ExeEsc != null) { ExeEsc(sender, e); } break; case "tsb_Find": if (ExeFind != null) { ExeFind(sender, e); } break; default: break; } }
wyjfed24 2013-07-21
  • 打赏
  • 举报
回复

经过测试通过思密达
wyjfed24 2013-07-21
  • 打赏
  • 举报
回复
/// <summary> /// 根据控件Name调用自身Click事件 /// </summary> /// <param name="controlName">控件Name</param> public void CallOnClick(string controlName) { if (this.Controls.ContainsKey(controlName)) { object o = this.Controls[controlName]; object[] p = new object[1]; p[0] = EventArgs.Empty; Type t = o.GetType(); MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance); m.Invoke(o, p); } } //参考地址:http://blog.csdn.net/dogfish/article/details/7048280
请叫我卷福 2013-07-21
  • 打赏
  • 举报
回复
注册所有的picturebox控件的Click事件 用同一个事件处理程序 picturebox1.Click+=img_Click; picturebox2.Click+=img_Click; picturebox3.Click+=img_Click; private void img_Click(object sender,EventArgs e) { string name = (sender as PictureBox).Name; DoSomething(name); } private void DoSomething(string imgName) { switch(imgName) //根据点击PictureBox 做出相应反应 { // ... //把你写在lblBtn1_Click()、lblBtn2_Click、lblBtn3_Click 中的逻辑写在这里 } } 楼上几位大神 说得有道理 由于具体需求不清楚 楼主可以参考该回帖
请叫我卷福 2013-07-20
  • 打赏
  • 举报
回复
引用 16 楼 sunylf 的回复:
xiaozhi_5638: 能提供一份完整的类代码给我么?Thanks! class MyLabel:Label 我这边的定义老是出错。
class MyLabel : Label { public void InvokeClick() { OnClick(null); } } 请用这个 那个有错
sunylf 2013-07-20
  • 打赏
  • 举报
回复
引用
引用 13 楼 sunylf 的回复: 请问 guwei4037: button.Click += (s, ea) => { MessageBox.Show(buttontext); }; 这段代码是什么意思? 我用的是vs2008, 我就是想执行控件的Click事件而已. 给button添加click事件,s和ea是2个传入的参数,但实际上代码就是弹出提示框
问题是我的Click事件早就定义好了,我只是想让程序在这一步时调用我定义好的事件或过程。
sunylf 2013-07-20
  • 打赏
  • 举报
回复
xiaozhi_5638: 能提供一份完整的类代码给我么?Thanks! class MyLabel:Label 我这边的定义老是出错。
please_call_me_J 2013-07-20
  • 打赏
  • 举报
回复
引用 7 楼 guwei4037 的回复:
这个就是我所说的,通过controls来find你要的控件
please_call_me_J 2013-07-20
  • 打赏
  • 举报
回复
引用 13 楼 sunylf 的回复:
请问 guwei4037: button.Click += (s, ea) => { MessageBox.Show(buttontext); }; 这段代码是什么意思? 我用的是vs2008, 我就是想执行控件的Click事件而已.
给button添加click事件,s和ea是2个传入的参数,但实际上代码就是弹出提示框
sunylf 2013-07-20
  • 打赏
  • 举报
回复
请问 guwei4037: button.Click += (s, ea) => { MessageBox.Show(buttontext); }; 这段代码是什么意思? 我用的是vs2008, 我就是想执行控件的Click事件而已.
请叫我卷福 2013-07-20
  • 打赏
  • 举报
回复
或者 class MyLabel:Label { public void InvokeClick() { if(Click!=null) { Click(null,null); } } } 注意两者区别 后者只激发Click事件 前面的可以调用基类的OnClick
请叫我卷福 2013-07-20
  • 打赏
  • 举报
回复
写错了 不好意思
请叫我卷福 2013-07-20
  • 打赏
  • 举报
回复
引用 9 楼 sunylf 的回复:
这个错误,要如何解决呢?
class MyLabel:Label { public void InvokeClick() { OnClick(null); } }
加载更多回复(13)

110,538

社区成员

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

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

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