根据控件名称,调用相应的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);
};
}
[解决办法]
给button添加click事件,s和ea是2个传入的参数,但实际上代码就是弹出提示框
[解决办法]
这个就是我所说的,通过controls来find你要的控件
[解决办法]
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 中的逻辑写在这里
}
}
楼上几位大神 说得有道理 由于具体需求不清楚 楼主可以参考该回帖
[解决办法]
我也只能想到这样,我认为是正解.
为了你少走弯路,仔细的看下事件和委托
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;
}
}
[解决办法]
/// <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");这么调用。