我需要做一些我非常确定应该简单的事情,我有Form控件,每个控件都有事件处理程序,用于设置正确格式化的标签等。
我需要的是为特定类型的每个控件调用每个处理程序集合。
我浏览了所有stackoverflow,从未看过结果。
这是简单的应用程序,所以请停止评论:“你需要从事件处理程序调用的其他函数”。
这就是我试过的
foreach (Control ctrl in Controls)
{
if (ctrl is TrackBar)
{
TrackBar tb = ctrl as TrackBar;
Invoke(tb.Scroll, tb, new EventArgs());
}
}
但我看到很奇怪的错误
事件'System.Windows.Forms.TrackBar.Scroll'只能显示在
的左侧+=
或-=
任何解决方案?
答案 0 :(得分:2)
您不能在声明事件的类之外引发事件(仅添加和删除处理程序)。而不是尝试引发将调用事件处理程序的事件,只需将处理程序逻辑提取到单独的方法,并调用该方法:
foreach (TrackBar tb in Controls.OfType<TrackBar>())
{
DoSomething(tb.Value);
}
和处理程序:
void trackBar_Scroll(object sender, EventArgs e)
{
DoSomething(((TrackBar)sender).Value);
}
答案 1 :(得分:0)
错误是因为tb.Scroll
event
不是delegate
。
答案 2 :(得分:0)
您可以尝试使用与事件相同的delegate
创建Signature
,为您的控件创建一个公共事件处理程序,然后您可以调用它或正常响应事件。
即
这样的事情:
public partial class Form1 : Form
{
public delegate void trackbarscroll( object sender, EventArgs e);
trackbarscroll tbs;
public Form1()
{
InitializeComponent();
trackBar1.Scroll += new EventHandler(trackBar_Scroll);
trackBar2.Scroll += new EventHandler(trackBar_Scroll);
tbs = trackBar_Scroll;
}
void trackBar_Scroll(object sender, EventArgs e)
{
TrackBar tb = (TrackBar)sender;
}
private void button1_Click(object sender, EventArgs e)
{
foreach (Control ctrl in Controls)
{
if (ctrl is TrackBar)
{
TrackBar tb = ctrl as TrackBar;
Invoke(tbs,tb, new EventArgs());
}
}
}
}