Ivan
Ivan

Reputation: 5248

C# event start looping

I have litle problem with event in MVP view and presenter. When _artistToolbarButton_Clickevent is fired he start show me another registred events. Why does this happen? Check animation and you will see antoher message box from another event is also fired!

enter image description here

Here is my form code:

Form:

 public partial class MainForm : Form, IMainView
    {
        #region Properties

        public IPresenter Presenter { get; set; }

        #endregion

        // Constructor
        public MainForm()
        {
            this.InitializeComponent();
            this.Presenter = new MainPresenter(this);
            this.WireEvents();
        }

        public event EventHandler<EventArgs> OnLoad;
        public event EventHandler<EventArgs> ShowArtist;
        public event EventHandler<EventArgs> ShowLibrary;
        public event EventHandler<EventArgs> ShowTopList;

        // Wire events
        private void WireEvents()
        {
            this.Load += new EventHandler(MainForm_Load);
            this._artistToolbarButton.Click += new EventHandler(_artistToolbarButton_Click);
            this._libraryToolbarButton.Click += new EventHandler(_libraryToolbarButton_Click);
            this._topListToolbarButton.Click += new EventHandler(_topListToolbarButton_Click);
        }

        #region Events
        // Load
        private void MainForm_Load(object sender, EventArgs e)
        {
            if(this.OnLoad != null)
            {
                this.OnLoad(this, EventArgs.Empty);
            }
        }

        // Artist
        private void _artistToolbarButton_Click(object sender, EventArgs e)
        {
            if (this.ShowArtist != null)
            {
                this.ShowArtist(this, EventArgs.Empty);
            }
        }

        // Library
        private void _libraryToolbarButton_Click(object sender, EventArgs e)
        {
            if (this.ShowLibrary != null)
            {
                this.ShowLibrary(this, EventArgs.Empty);
            }
        }

        // Top list
        private void _topListToolbarButton_Click(object sender, EventArgs e)
        {
            if (this.ShowTopList != null)
            {
                this.ShowTopList(this, EventArgs.Empty);
            }
        }
        #endregion
    }

   public class MainPresenter : IPresenter
    {
        private IMainView _view;

        // Constructor
        public MainPresenter(IMainView view)
        {
            this._view = view;
            this.WireEvents();
        }

        // Wire events
        public void WireEvents()
        {
            this._view.OnLoad += OnLoad;
            this._view.ShowArtist += ShowArtist;
            this._view.ShowArtist += ShowLibrary;
            this._view.ShowArtist += ShowTopList;
        }

        // On load
        private void OnLoad(object sender, EventArgs e)
        {
            MessageBox.Show("OnLoad");
        }

        // ShowArtist
        private void ShowArtist(object sender, EventArgs e)
        {
            MessageBox.Show("ShowArtist");
        }

        // ShowLibrary
        private void ShowLibrary(object sender, EventArgs e)
        {
            MessageBox.Show("ShowLibrary");
        }

        //ShowTopList
        private void ShowTopList(object sender, EventArgs e)
        {
            MessageBox.Show("ShowTopList");
        }
    }

Presenter:

   public class MainPresenter : IPresenter
    {
        private IMainView _view;

        // Constructor
        public MainPresenter(IMainView view)
        {
            this._view = view;
            this.WireEvents();
        }

        // Wire events
        public void WireEvents()
        {
            this._view.OnLoad += OnLoad;
            this._view.ShowArtist += ShowArtist;
            this._view.ShowArtist += ShowLibrary;
            this._view.ShowArtist += ShowTopList;
        }

        // On load
        private void OnLoad(object sender, EventArgs e)
        {
            MessageBox.Show("OnLoad");
        }

        // ShowArtist
        private void ShowArtist(object sender, EventArgs e)
        {
            MessageBox.Show("ShowArtist");
        }

        // ShowLibrary
        private void ShowLibrary(object sender, EventArgs e)
        {
            MessageBox.Show("ShowLibrary");
        }

        //ShowTopList
        private void ShowTopList(object sender, EventArgs e)
        {
            MessageBox.Show("ShowTopList");
        }
    }

Upvotes: 0

Views: 139

Answers (2)

Roman
Roman

Reputation: 12171

You should properly subscribe to events in Presenter:

public void WireEvents()
{
    this._view.OnLoad += OnLoad;
    this._view.ShowArtist += ShowArtist;  // this._view.ShowArtist
    this._view.ShowLibrary += ShowLibrary; // this._view.ShowArtist
    this._view.ShowTopList += ShowTopList; // this._view.ShowArtist
}

Upvotes: 1

vandango
vandango

Reputation: 567

Change your code into this one:

// Wire events
public void WireEvents()
{
    this._view.OnLoad += OnLoad;
    this._view.ShowArtist += ShowArtist;
    this._view.ShowLibrary += ShowLibrary;
    this._view.ShowTopList += ShowTopList;
}

It's simply a event link error :)

Upvotes: 2

Related Questions