读书人

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

发布时间: 2013-08-04 18:26:16 作者: rapoo

根据控件名称,调用相应的Click事件
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);
} 根据控件名称,调用相应的click事件
[解决办法]
你可以试试在controls中通过name来find到,然后对这个找到的控件click(), 具体能不能实现我没做过,但我猜测应该可以
[解决办法]
***这里该加入什么语句就能实现和 lblBtn1_Click(sender, e); 等效的功能呢?
那你就把这个事件注册到click里面就行了。
[解决办法]
class MyLabel:Label
{
public void InvokeClick()
{
OnClick(null,null);
}
}

//把Label换成MyLabel
2. private void imgBtn1_Click(object sender, EventArgs e)
{
string sName = ((PictureBox)sender).Name;
sName = sName.Replace("img", "lbl");
foreach (Control label1 in (panelMain.Controls))
{
if (label1 is MyLabel)
{
if (label1.Name == sName)
{
label1.InvokeClick(); //


break;
}
}
}
***问题是,如何实现下面的功能?不要直接用下面语句,因为有很多类似的名称要实现此功能,不想一一拼写。比如lblBtn1对应imgBtn1,lblBtn2对应imgBtn2.......n对n,等等 
//lblBtn1_Click(sender, e);
}
[解决办法]
refer :

string buttonName = "button";
for (int i = 1; i < 5; i++)//这里拖了4个button
{
string buttontext = buttonName + i;
Button button = this.Controls.Find(buttontext, false)[0] as Button;
button.Click += (s, ea) =>
{
MessageBox.Show(buttontext);
};
}

[解决办法]
引用:
请问 guwei4037:
button.Click += (s, ea) =>
{
MessageBox.Show(buttontext);
};
这段代码是什么意思?
我用的是vs2008,
我就是想执行控件的Click事件而已.


给button添加click事件,s和ea是2个传入的参数,但实际上代码就是弹出提示框
[解决办法]
引用:


这个就是我所说的,通过controls来find你要的控件
[解决办法]


引用:
xiaozhi_5638:
能提供一份完整的类代码给我么?Thanks!
class MyLabel:Label
我这边的定义老是出错。


class MyLabel : Label
{
public void InvokeClick()
{
OnClick(null);
}
}
请用这个 那个有错
[解决办法]
你的所谓lblBtn1_Click(sender, e) 内部执行什么处理呢?在你的程序中应该直接调用这个处理方法。例如
private bt1_Click(object sender,EventArgs e)
{
call(abc,"123");
}

private void main()
{
call(abc,"123"); //模拟点击bt1的处理
}


你实际上根本不需要什么“遍历按钮”操作,你需要研究程序程序流程,知道直接调用call方法或者从一个List<Action>中把需要执行委托娶到,直接调用它们。

设计时,你应该想到的是业务处理,也就是这些按钮背后的处理方法和数据,直接调用这些方法。假设现在把 lblBtn10控件改为使用FormView或者TreeView或者用户控件实现,你设计出来的代码也不应该修改。
[解决办法]
关于题目,我有点不明白,有两个疑问,望解答:

1、控件执行的点击操作是否都是达到同一效果,如果都是相同操作,所有控件加入同一事件即可;
如果是不同的处理,那请问你,这些不同的代码应该写在哪?
特别是那些一一对应的事件,用VS自带的事件不是更好?
2、上例看到,反正你也需要一个控件一个事件,将程序本身内聚性很强地指向,改成这样高耦合的
“匹配”方式是不是逻辑“倒退”了,有什么现实意义?
[解决办法]
注册所有的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 中的逻辑写在这里
}
}

楼上几位大神 说得有道理 由于具体需求不清楚 楼主可以参考该回帖
[解决办法]
引用:
注册所有的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;
}
}
[解决办法]

引用:
Quote: 引用:

引用
/// <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对象。



/// <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");这么调用。

读书人网 >C#

热点推荐