使用具有单个事件的两个委托时订阅不正确

时间:2011-10-02 19:35:51

标签: c# events delegates

大家好,我遇到了一些麻烦,使用委托代表相同的事件,有两种形式(父母和孩子),这是我的代码:

public delegate void SplitDelegate(object s, ControllerEventArgs e);
public delegate void SetBatchDelegate(object s, ControllerEventArgs e);

public class ControllerEventArgs : EventArgs
{
    public string sp1;
    public int ip1;
    public int ip2;

    public ControllerEventArgs(string sp1)
    {
        this.sp1 = sp1;
    }

    public ControllerEventArgs(int p1, int p2)
    {
        this.ip1 = p1;
        this.ip2 = p2;
    }

    public ControllerEventArgs(string sp1, int p1, int p2)
    {
        this.sp1 = sp1;
        this.ip1 = p1;
        this.ip2 = p2;
    }
}

public interface IController
{
    event SplitDelegate splitRowEvent;
    event SetBatchDelegate setSmallBatchEvent;
    void InvokeControllerEvent(string p1);
    void InvokeControllerEvent(int p1, int p2);
    void InvokeControllerEvent(string sp1, int p1, int p2);

}

public class Controller : IController
{
    public event SplitDelegate splitRowEvent;
    public event SetBatchDelegate setSmallBatchEvent;

    public void InvokeControllerEvent(string p1)
    {
        this.OnControllerEvent(new ControllerEventArgs(p1));
    }

    public void InvokeControllerEvent(int p1, int p2)
    {
        this.OnControllerEvent(new ControllerEventArgs(p1, p2));
    }

    public void InvokeControllerEvent(string sp1, int p1, int p2)
    {
        this.OnControllerEvent(new ControllerEventArgs(sp1, p1, p2));
    }

    protected virtual void OnControllerEvent(ControllerEventArgs e)
    {
        if (this.splitRowEvent != null)
        {
            this.splitRowEvent.Invoke(this.splitRowEvent, e);
        }
        if (this.setSmallBatchEvent != null)
        {
            this.setSmallBatchEvent.Invoke(this.setSmallBatchEvent, e);
        }
    }
}

例如,当我打电话给表格A时:

frmFormB.controller.InvokeControllerEvent("ugPER");

当我只想使用第一个SplitRowEvent

时,会处理这两个调用

有没有办法使用正确的语法重新生成我的代码以获得正确的回调?

添加了最佳解释:

button1_click:

SmallBatchSplitSetRows frmModal = new SmallBatchSplitSetRows(this.controller);
            frmModal.controller.InvokeControllerEvent("ugFAB");
            frmModal.ShowDialog();

button2_click:

 SmallBatchSplitInput frmModal = new SmallBatchSplitInput(this.controller);
            frmModal.controller.InvokeControllerEvent("ugPER");
            frmModal.ShowDialog();

1 个答案:

答案 0 :(得分:2)

您的OnControllerEvent方法显式调用使用splitRowEventsetSmallBatchEvent。如果您不想要它,只需更改方法的内容。

最终,不清楚为什么你有两个不同的事件,但只有一种方式通过三个重载来调用它们。这三个重载是否意味着做不同的事情?每个人都打算调用一组不同的事件处理程序吗?这是使用描述性名称而不是重载的地方真的很有用。