c# - 创建委托(delegate) MouseEventHandler 的新实例

标签 c# delegates mouseevent anonymous-function

动态创建按钮时,我希望有一个新的 MouseEventHandler。我是这样做的,

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());

但是,由于我需要将参数传递给事件,所以我让 generatePopup 接受一个表示按钮编号的整数(以便我可以进一步使用)。在过去,我只会使用匿名委托(delegate)来传递额外的参数,但这似乎不起作用,因为我想创建一个新的实例;

this.Controls[btnAdd.Name].MouseClick += delegate(object sender, MouseEventArgs e) { new MouseEventHandler( generalMethods.generatePopup(sender, e, i); };

看来错误出在新的 MouseEventHandler 上。如果我把它拿出来,它工作正常,我可以传递额外的数据,但因为它不是一个新实例,它不会像这样给每个按钮它自己的事件;

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());

有谁知道如何解决这个问题?例如,仍然使用匿名委托(delegate)方法,但仍然创建事件的新实例?

编辑:嗯,我试过了(我相信参数通过得很好)但它似乎不是为每个按钮创建一个新的 mouseventhandler,而是对所有按钮使用相同的按钮,因为我已经设置了一个标签测试它是否获得正确的按钮编号,但弹出窗口中的所有标签都返回最后一个按钮编号而不是正确的按钮编号。有什么想法吗?

编辑 2:这是我用于生成按钮的代码块:

 for (int i = 0; i <= count && i < 2; i++)
        {

            Button btnAdd = new Button();
            btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
            btnAdd.Location = new Point(x, y);
            btnAdd.Tag = i;
            btnAdd.Name = "btn" + i.ToString();
            btnAdd.BackColor = Color.Green;

            this.Controls.Add(btnAdd);

            this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
{
    int index = i;
    generalMethods.generatePopup(sender, e, index);
};

这是我的 generatePopup 方法,它是 mouseEventHandler:

public void generatePopup(object sender, MouseEventArgs e, int buttonNumber)
    {
      //  DBConnector mDBConnector = new DBConnector();
      //  DataTable dataTable = mDBConnector.Select("SELECT * FROM devices WHERE deviceID = " + buttonNumber);


        DeviceBreakdownPopup popupDevice = new DeviceBreakdownPopup();
        popupDevice.lblDeviceNo.Text = buttonNumber.ToString();

        PopupWindow popup = new PopupWindow(popupDevice);
        popup.Show(Cursor.Position);

    }

为了清楚起见,这是正在发生的事情的图像:

example of error

这里我们看到给定标签“2”的两个弹出用户控件,而我需要每个都有正确的值,“1”和“2”。

最佳答案

试试这个:

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(
    (sender, evt) => {
        generalMethods.generatePopup()
    }
);

new MouseEventHandler(...) 部分是可选的 - 编译器从 += 赋值的左侧计算出参数类型。

编辑 您的代码的问题是它访问修改后的闭包。您应该从 i 创建一个临时变量,并在您的 lambda 中使用它来解决问题。

for (int i = 0; i <= count && i < 2; i++)
    {

        Button btnAdd = new Button();
        btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
        btnAdd.Location = new Point(x, y);
        btnAdd.Tag = i;
        btnAdd.Name = "btn" + i.ToString();
        btnAdd.BackColor = Color.Green;

        this.Controls.Add(btnAdd);
        var temp = i;
        this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
            {
            int index = temp;
            generalMethods.generatePopup(sender, e, index);
        };
}

关于c# - 创建委托(delegate) MouseEventHandler 的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722092/

相关文章:

c# - asp.net updatePanel PostBackTrigger 触发全回发

c# - 模拟对象在单元测试中为空

swift - 在 UI View 之间进行分段和传输数据。 [ map 套件]

c# - 通用函数的委托(delegate)

matlab - matlab中有什么办法让鼠标粘在曲线上吗?

python - 如何为 QGraphicsItem 中有孔的形状获取鼠标悬停事件?

c# - 输入字符串的格式不正确 #2

c# - printdocument 添加空白页

c# - 如何使用包含运行时值的委托(delegate)来初始化事件?

javafx - 如何在JavaFX 8中使鼠标透明化?