Неправильная подписка при использовании двух делегатов с одним событием - PullRequest
0 голосов
/ 02 октября 2011

Привет, ребята. У меня возникают проблемы с использованием делегатов для записи в одно и то же событие, связанное с двумя формами (родительским и дочерним), это мой код:

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 Ответ

2 голосов
/ 02 октября 2011

Ваш OnControllerEvent метод явно вызывает использование splitRowEvent и setSmallBatchEvent.Если вы этого не хотите, просто измените содержимое метода.

В конечном итоге неясно, почему у вас есть два разных события, а есть только один способ их вызова через три перегрузки.Три перегрузки предназначены для разных вещей?Каждый из них должен вызывать разные наборы обработчиков событий?Именно здесь было бы полезно использовать описательные имена вместо перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...