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...
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...