首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-08-04 
根据控件名称,调用相应的Click事件1. private void lblBtn1_Click(object sender, EventArgs e){//程序响

根据控件名称,调用相应的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");这么调用。

热点排行