为按钮单击事件生成委托

本文关键字:事件 按钮 单击 | 更新日期: 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);
}