Event and Delegate Question

  • Thread starter Thread starter Claudio Pallone
  • Start date Start date
C

Claudio Pallone

Guest
Hi,

In an attempt to get my head around how events and delegates work in C#, I have created a project with two classes clsSQLServer and clsOracle








I have also created three events. Two use the default EventHandler delegate and the other uses a custom DatabaseUpadateEventHandler delegate.

public interface IDatabase
{
void Update(string message);
event EventHandler Start;
event EventHandler Ended;
event DatabaseUpadateEventHandler MessageSet;
}

public class DatabaseUpadateEventArgs : EventArgs
{
public string Message;

public DatabaseUpadateEventArgs(string message)
{
this.Message = message;
}
}

I have implemented it using the OnEventName method for each event. However, I have seen some code online where people use events like this and do not have an OnEventName method:

event EventHandler<MonthArgs> MonthsLoaded;

public class MonthArgs : EventArgs
{

public List<Month> Months { get; set; }

public MonthArgs()
{
Months = new List<Month>();
}
}

service.MonthsLoaded += new EventHandler<MonthArgs>(service_MonthsLoaded);

I would like to understand what is the best way to do it and what the difference is. Also, how could I change my implementation to use this new method? Please can someone shed some ideas and code?

Thanks

My implementation code:

public class clsSQLServer : IDatabase
{
public event EventHandler Start;

protected virtual void OnStart(EventArgs e)
{
if (this.Start != null)
{
this.Start(this, e);
}
}

public event EventHandler Ended;

protected virtual void OnEnded(EventArgs e)
{
if (this.Ended != null)
{
this.Ended(this, e);
}
}

//public delegate void DatabaseUpadateEventHandler(object sender, DatabaseUpadateEventArgs e);
public event DatabaseUpadateEventHandler MessageSet;

protected virtual void OnMessageSet(DatabaseUpadateEventArgs e)
{
if (this.MessageSet != null)
{
this.MessageSet(this, e);
}
}

public void Update(string message)
{
// CODE TO update clsSQLServer db
// Raise event to notify others
this.OnStart(new EventArgs());
this.OnMessageSet(new DatabaseUpadateEventArgs(message));
System.Threading.Thread.Sleep(2000);
this.OnEnded(new EventArgs());

}
}

++++

Here I have to subscribe to the event twice so that both object raise it. I do not think that is right. Any ideas?

Also, I am not sure where I have to remove the event. I have tried to remove it on the handler function but I cannot see if there.

private void button1_Click(object sender, EventArgs e)
{
IDatabase objDb;
objDb = new clsSQLServer();

objDb.MessageSet += new DatabaseUpadateEventHandler(objDb_MessageSet);

clsCustomerObject obj = new clsCustomerObject();
obj.Update(objDb);
objDb = new clsOracle();

objDb.MessageSet += new DatabaseUpadateEventHandler(objDb_MessageSet);

obj.Update(objDb);


}

void objDb_MessageSet(object sender, DatabaseUpadateEventArgs e)
{
IDatabase obj = sender as IDatabase;
//obj.MessageSet -=
MessageBox.Show("Update button for " + e.Message);
}

Continue reading...
 
Back
Top