为按钮单击事件生成委托
本文关键字:事件 按钮 单击 | 更新日期: 2023-09-27 18:19:05
我只想创建一个按钮列表。但是每个按钮都应该做一些不同的事情。
它只是为了训练。我是C#
新手.
我现在拥有的:
for (int i = 0; i < answerList.Count; i++)
{
Button acceptButton = new Button { Content = "Lösung" };
acceptButton.Click += anonymousClickFunction(i);
someList.Items.Add(acceptButton);
}
我想生成这样的Click-Function
:
private Func<Object, RoutedEventArgs> anonymousClickFunction(i) {
return delegate(Object o, RoutedEventArgs e)
{
System.Windows.Forms.MessageBox.Show(i.toString());
};
}
/// (as you might see i made a lot of JavaScript before ;-))
我知道代表不是 Func...但我不知道我必须在这里做什么。
但这行不通。
你有什么建议我怎么做这样的事情吗?
编辑:解决方案
我瞎了...没有想过创建一个路由事件处理程序:-(
private RoutedEventHandler anonymousClickFunction(int id) {
return new RoutedEventHandler(delegate(Object o, RoutedEventArgs e)
{
System.Windows.Forms.MessageBox.Show(id.ToString());
});
}
我假设你想要一个函数数组,并且你想通过索引获取函数?
var clickActions = new RoutedEventHandler[]
{
(o, e) =>
{
// index 0
},
(o, e) =>
{
// index 1
},
(o, e) =>
{
// index 2
},
};
for (int i = 0; i < clickActions.Length; i++)
{
Button acceptButton = new Button { Content = "Lösung" };
acceptButton.Click += clickActions[i];
someList.Items.Add(acceptButton);
}
嗯,你能做什么。如下,简单明了。
for (int i = 0; i < answerList.Count; i++)
{
var acceptButton = new Button { Content = "Lösung" };
acceptButton.Click += (s, e) => MessageBox.Show(i.ToString());
someList.Items.Add(acceptButton);
}
您可以将 lambda 表达式用于匿名方法:
for (int i = 0; i < answerList.Count; i++)
{
Button acceptButton = new Button { Content = "Lösung" };
acceptButton.Click += (sender, args) => System.Windows.MessageBox.Show(i.toString());
someList.Items.Add(acceptButton);
}