当前位置: 代码迷 >> C# >> 怎么动态绑定按钮的点击事件
  详细解决方案

怎么动态绑定按钮的点击事件

热度:100   发布时间:2016-05-05 04:47:53.0
如何动态绑定按钮的点击事件?
本帖最后由 TrueYi 于 2015-02-08 22:22:56 编辑

        private void btnAdd_Click(object sender, EventArgs e)
        {
            MessageBox.Show("新增");
        }

        private void btnModify_Click(object sender, EventArgs e)
        {
            MessageBox.Show("修改");
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            MessageBox.Show("删除");
        }

 ......


以上为各个按钮的事件,有很多个.
以下是想动态对应绑定以上事件,
问题来了
            
var Items = new List<MyButton>()
{
                new MyButton("新增","tbtnAdd","btnAdd_Click"),
                new MyButton("修改","tbtnModify","btnModify_Click"),
                new MyButton("删除","tbtnDelete","btnDelete_Click")                
 };

            foreach (var item in items)
            {
                var btn = new Button();
                btn.Text = item.Text;
                btn.Name = item.Name;
              //btn.Click += new EventHandler(item.ClickEvent);  //以上因为这句里的item.ClickEvent是字符串,知道事件的名称,怎样通过事件名称绑定事件
            }


以下为自定义按钮对象:

    public class MyButton
    {
        public MyButton(string text, string name, string clickEvent)
        {
            Text = text;
            Name = name;
            ClickEvent = clickEvent;
        }
        public string Text { get; set; }
        public string Name { get; set; }
        public string ClickEvent { get; set; }
    }

------解决思路----------------------

只能返射来做了。
------解决思路----------------------

var ei = typeof(Button).GetEvent("Click");
var d = Delegate.CreateDelegate(typeof(EventHandler), this, item.ClickEvent);
ei.AddEventHandler(btn, d);

------解决思路----------------------
为什么不直接用EventHandler delegate呢?看不到用字符串的优点(字符串的好处是可以存数据库,但由于你用是函数名字,函数名字存储在外面,有泄露内部实现细节的嫌疑)。

    public class MyButton
    {
        public MyButton(string text, string name, EventHandler clickEvent)
        {
            Text = text;
            Name = name;
            ClickEvent = clickEvent;
        }
        public string Text { get; set; }
        public string Name { get; set; }
        public EventHandler ClickEvent { get; set; }
    }


var Items = new List<MyButton>()
{
                new MyButton("新增","tbtnAdd",btnAdd_Click),
                new MyButton("修改","tbtnModify",btnModify_Click),
                new MyButton("删除","tbtnDelete",btnDelete_Click)                
 };
 
            foreach (var item in items)
            {
                var btn = new Button();
                btn.Text = item.Text;
                btn.Name = item.Name;
                btn.Click += itemm.ClickEvent; //
            }

------解决思路----------------------
都绑定同一个函数不好吗?
然后在函数里判断sender(触发事件的对象),强制转换回BUTTON,再根据不同的TEXT,show不同的内容
  相关解决方案