当前位置: 代码迷 >> C# >> EventHandler 带参数传送
  详细解决方案

EventHandler 带参数传送

热度:562   发布时间:2016-05-05 05:19:12.0
EventHandler 带参数传递
本帖最后由 sinat_15262463 于 2015-01-04 12:33:41 编辑
忽略标题吧。        基本流程是这样的。   

通过代码生成的PictureBox控件。  需要添加右键删除功能。

删除的时候要获取到ID(ID值存在PictureBox.Tag中)。

代码如下:

        void dpb_MouseDown(object sender, MouseEventArgs e)
        {
            Control control = sender as Control;
            //label3.Tag = control.Tag;/////忽略之,这是后来想到的的笨办法 = =
            if (e.Button == MouseButtons.Right)
            {
                ContextMenu menu = new ContextMenu();
                menu.MenuItems.Add("删除");
                menu.MenuItems[0].Click += new EventHandler(dpb_RClick);
                menu.Show(control, new Point(e.X, e.Y));
            }
        }


然后在dpb_RClick中进行处理,dpb_RClick用

Control control = sender as Control;
control.Tag//----这里想获取ID值的,结果是null值了。


所以想问问PictureBox.Tag里的ID值怎么传递下去,然后进行操作。
------解决思路----------------------
首先,你可以使用“匿名委托”功能,例如写
menu.MenuItems[0].Click +=(s, arg)=>
{
    menu_delete((string)control.Tag);
};


这样,当执行
private void menu_delete(string id){ ...} 
方法时,就传递了正确的 ID。

如果使用4、5年前的c#,可能没有匿名委托功能。那么你可以封装一个自己的class,例如
public class MyDeleteAction
{
    public string ID;
    
    public void dpb_RClick(object sender, EventArgs e)
    { 
        ......
    }
}
也就说,你的 dpb_RClick 方法不是定义在当前的 class 内的,而是定义在另外一个对象类型的。然后你的代码可以修改为
                ContextMenu menu = new ContextMenu();
                menu.MenuItems.Add("删除");
                MyDeleteAction x = new MyDeleteAction();
                x.ID = (string)control.Tag;
                menu.MenuItems[0].Click += new EventHandler(x.dpb_RClick);


这样,当 dpb_RClick 方法执行时,就可以取到 ID 参数了。