通过对象投掷事件

时间:2009-12-13 08:37:37

标签: c# winforms events compact-framework

我正在使用 .Net Compact Framework 2.0 SP2 C#开发 Windows Mobile 5.0或更高版本应用程序。

我有一个Winform( Form1 ),其中一个控件( Control1 )包含另一个控件( Control2 )。例如,带有面板的winform和此面板内部有一个按钮,但在我的情况下, Control1 Control2 是自定义控件。

Control2 有一个事件,点击,当用户点击它时会引发该事件。此点击事件必须由 Form1 处理。为此,我首先处理 Control1 上的事件,该事件会抛出在 Form1 上处理的新事件。这是我的代码:

在Control1上:

public event EventHandler Control2Click;

private void control2_Click(object sender, EventArgs e)
{
    if (Control2Click != null)
    {
        Control2Click(sender, e);
    }
}

在Form1上:

private void control1_Control2Click(object sender, EventArgs e)
{
    // Do something interesting.
}

有没有更好的方法直接在 Form1 中处理Control2_Click?我不知道我的方式是否有糟糕的表现,这种事件可以更好地处理。

谢谢!

2 个答案:

答案 0 :(得分:2)

不,你做得对。这是从嵌套控件中冒出事件的正确方法,该控件无法从容器控件直接访问。您通常使用PerformClick()方法来触发Click事件,但这似乎在CF中不可用。

Perf不是问题,在桌面计算机上调用委托目标非常快,大约十几纳秒左右。 Click是一个“人类时间”事件,任何小于20毫秒的事件都被视为“即时”。

答案 1 :(得分:0)

什么阻止您直接从Form1连接Control2 Click事件? Control1是否通过属性公开Control2?或者可能在Control1上公开一个实际挂钩到Control2 Click事件的事件?例如:

// In Control1
// Assuming Control2 is some sort of Save button, for example
public EventHandler SaveClicked
{
    add { control2.Click += value; }
    remove { control2.Click -= value; }
}

请注意:

  • 如果您在control2内更改Control1的值,则不会“转移”事件处理程序,这将是不幸的
  • 事件处理程序中的sender参数将引用Control2,而不是Control1

老实说,我不希望这是一个性能问题,但你处理它 - 它只是一个委托调用或两个。