所以,首先我生成一个包含由按钮和进度条组成的自定义用户控件的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
}
答案 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?