C ++ / CLI将其他参数传递给事件处理方法

时间:2016-01-20 04:29:21

标签: event-handling c++-cli

我正在尝试编写一个C ++ / CLI表单应用程序,它在运行时创建了很多按钮:我有一个字符串向量,每个字符串都创建一个按钮:

std::vector<std::string> strings;
/*
    string being initialized with values from file
*/
for ( std::vector<std::string>::iterator it = heroes.begin(); it != heroes.end(); ++it ) {
    Button ^ button = gcnew Button;
    /*
        button being customized depending on the string
    */
    buttonPannel->Controls->Add(button);
}

现在我要做的是为每个按钮添加一个事件处理程序,其方式是用于自定义按钮的字符串将传递给处理方法。

在c#中,我会写一些类似

的内容
button->Click += new EventHandler((sender, args) => button_Click(s, e, *it));

如何在C ++ / CLI中实现此目的?

1 个答案:

答案 0 :(得分:1)

你可以完全等同于你的C#代码,但我宁愿利用Button类上的现有属性来保存你需要的额外数据。

在这种情况下,Tag属性似乎是合适的:它的目的是保存您需要的与控件密切相关的任何额外数据,因此这似乎是驱动程序逻辑的字符串的重点。 (您可能需要将其设为托管 $('#swipe').on('click', function () { $('#mySelect1 option').prop('selected', true); moveItems('#mySelect1', '#mySelect2'); $('#mySelect2 option').each(function(){ if($(this).is(':selected')) { $(this).prop('selected', false); } else { $(this).prop('selected', true); } }); moveItems('#mySelect2', '#mySelect1'); $('#mySelect1 option,#mySelect2 option').prop('selected', false); }); 对象,而不是String^,但这很容易转换。)

std::string

如果你确实想要做相当于你的C#代码:你的C#lambda正在对void Form1::CreateButtons() { for (std::vector<std::string>::iterator it = heroes.begin(); it != heroes.end(); ++it) { Button ^ button = gcnew Button; button->Tag = marshal_as<String^>(*it); button->Click += gcnew EventHandler(this, &Form1::button_Click); buttonPanel->Controls->Add(button); } } void Form1::button_Click(Object^ sender, EventArgs^ e) { Control^ senderControl = dynamic_cast<Control^>(sender); String^ heroName = nullptr; if(senderControl != nullptr) heroName = dynamic_cast<String^>(senderControl->Tag); if(heroName == nullptr) { // Something went wrong. Bail out. return; } // ... } 变量进行变量捕获。我们可以在C ++ / CLI中进行变量捕获,它只是手动更多。

(注意:您的C#示例是捕获迭代器,而不是字符串,不确定是否是预期的。我写这个来捕获字符串对象。)

it

(注意:我不在编译器中,因此可能存在语法错误。)

显然,使用按钮对象上的现有属性比较简单,但这就是C ++编译器在幕后所做的C ++ / CLI。