【问题标题】:How to bind a function to Click event of each control in an array of controls in C#如何将函数绑定到C#中控件数组中每个控件的Click事件
【发布时间】:2011-06-22 11:13:30
【问题描述】:

在 C# 中创建控件数组时,如何将接收单击按钮索引的函数绑定到其单击事件?

这里有一些代码只是为了更好地理解。在代码顶部的某个地方定义按钮:

Button [] buttons = new Button[100];

它们的标准 Click 事件如下所示:

private void myClick(object sender, EventArgs e)
{

}

通常你会这样绑定它:

for (int i = 0; i < 100; i++)
    buttons[i].Click += myClick;

但我希望事件处理程序采用这种形式:

private void myClick(int Index)
{

}

我应该如何将点击事件绑定到带有/不带有临时函数的上述函数?

我考虑过使用委托、Func&lt;T, TResult&gt; 表示法,或者以某种方式传递一个包含单击按钮索引的自定义 EventArgs;但由于缺乏足够的 C# 知识,我没有成功。

如果你们中的任何人建议将每个控件的索引保存在其标签中:是的,这是可能的,但出于某种原因我不想使用它,因为如果你有一个抛出一些事件但没有的类'没有 Tag 属性什么的,这种方式没用。

【问题讨论】:

    标签: c# winforms event-handling bind control-array


    【解决方案1】:
    int index = i;    
    buttons[index].Click += (sender, e) => myClick(index);
    

    正如下面评论中所发布的,由于它的范围,使用“i”将对所有控件使用相同的变量。因此,有必要在与 lambda 表达式相同的范围内创建一个新变量。

    【讨论】:

    【解决方案2】:
    private void myClick(object sender, EventArgs e)
    {
        int index = buttons.IndexOf(sender as Button);
    }
    

    【讨论】:

    • 这要求按钮是一个字段,并且在按钮数组中线性搜索
    • 我知道这一点,我投票赞成你的答案,因为我喜欢他们。但是,我绝对不会错过处理程序中的EventArgs。可能正在进一步发展,需要与他们互动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多