使用事件传递价值

时间:2015-07-16 23:26:01

标签: c# winforms

所以,首先我生成一个包含由按钮和进度条组成的自定义用户控件的List,我使用for循环生成它。

在这个循环中我将每个事件发送到所需的方法,现在我需要的是访问重置方法内的进度条,我该怎么做?

ProgressTimerList[i].Button.Reset += Button_Reset;
ProgressTimerList[i].Progressbar //////Need access to this object

 void Button_Reset(object sender, EventArgs e)
        {
            //////Inside of here
        }

3 个答案:

答案 0 :(得分:2)

使用类型为Progressbar的属性创建一个继承自EventArgs的类,并将其传递给处理程序:

public class MyButtonEventArgs : EventArgs{
    public --WhateverProgressbarTypeIs-- Bar {get;set;}
}

ProgressTimerList[i].Button.Reset += (sender, e) => Button_Reset(sender, new MyEventArgs { Bar = ProgressTimerList[i].Progressbar });

void Button_Reset(object sender, MyButtonEventArgs e)
{
    var wunderBar = e.Bar;
}

答案 1 :(得分:1)

到目前为止,处理此问题的最简单方法是使用匿名方法。

在您附加处理程序的代码中,请尝试以下操作:

ProgressTimerList[i].Button.Reset += (s, e) =>
{
    //////Inside of here
    ProgressTimerList[i].Progressbar //////Can access this object
};

无需Button_Reset方法。

另一个好处是,它将事件处理封装在方法中,以便其他代码不能直接调用Button_Reset。由于封装是OOP的四大支柱之一,因此有助于使代码更加健壮。

如果您需要分离处理程序,可以执行以下操作:

EventHandler button_reset = (s, e) =>
{
    //////Inside of here
    ProgressTimerList[i].Progressbar; //////Can access this object
    ///more code
    ///detach
    ProgressTimerList[i].Button.Reset -= button_reset;
};

ProgressTimerList[i].Button.Reset += button_reset;

如果您在e中与MainForm_Load的名称发生冲突,请改为将其称为e2

您可能遇到的另一个问题是,您正在访问事件处理程序中的数组中的项目。在处理程序中使用变量之前,您可能需要在本地捕获变量。

像这样:

for (var i = 0; i < ProgressTimerList.Count(); i++)
{
    var local_i = i;
    EventHandler button_reset = (s, e) =>
    {
        //////Inside of here
        ProgressTimerList[local_i].Progressbar; //////Can access this object
        ///more code
        ///detach
        ProgressTimerList[local_i].Button.Reset -= button_reset;
    };

    ProgressTimerList[i].Button.Reset += button_reset;
}

答案 2 :(得分:0)

((ProgressTimerListType)((Button)sender).Parent).ProgressBar

感谢Ron Beyer解决了这个问题!谢谢!

如果有人想要了解更多细节,我可以问,为什么我需要先将发件人转换为按钮,而不仅仅是使用sender.Parent?