Собитие + делегат. Некоторые аспекты. Тока ногами не бейте
От: m_CodeTyper Молдова  
Дата: 20.10.05 06:34
Оценка:
Дано:

1.
Класс типа CApp, в котором создаются объекты классов типа CDBCRM и CForm:

public class CApp
{
    private static CDBCRM m_DBCRM;
    private static CForm m_frmMain;
//... и т.п.
}


Класс CDBCRM представляет функции работы с БД ну а форма — понятно...

2.
В классе CDBCRM интерес представляет поле m_Connection:


public class CDBCRM
{
...
    public SqlConnection    m_Connection;
...
}


3.
Есть необходимость обрабатывать событие m_Connection.StateChange. Тогда появляется следующее:

public class CDBCRM
{
...
   //конструктор
   public CDBCRM()
   {
       m_Connection = new SqlConnection();
       m_Connection.StateChange += new StateChangeEventHandler(OnStateChange);
   }

   // и далее по ходу

   public delegate void ConnectionEventHandler(object sender, StateChangeEventArgs e);
   public static event ConnectionEventHandler ConnectionStateChange;
   private void OnStateChange(object sender, StateChangeEventArgs e)
   {
       if (ConnectionStateChange != null)
              ConnectionStateChange(sender, e);
   }
...
}


В конструкторе класса CApp соответственно вешаем приемник события ConnectionStateChange

CDBCRM.ConnectionStateChange += new CDBCRM.ConnectionEventHandler(frmMain.OnCRMStateChange);


а в форме соответственно:

public void OnCRMStateChange(object sender, StateChangeEventArgs e)
{
    //do some work
}


Вопросы:

1.
Имею я право сделать так:

public class CDBCRM
{
   public event ConnectionEventHandler ConnectionStateChange;
}

// и соответственно не

CDBCRM.ConnectionStateChange += new CDBCRM.ConnectionEventHandler(frmMain.OnCRMStateChange);

//a

m_DBCRM.ConnectionStateChange += new CDBCRM.ConnectionEventHandler(frmMain.OnCRMStateChange);


т.к. хочу обрабатывать это событие не на уровне типа, а на уровне объекта класса?
И так и так все работает просто кто-нить развейте сомнения

2.
Неужели так все сложно? В классе делегирующем обработчик на стандартное событие (m_Connection.StateChange)
перехватывать его (m_Connection.StateChange += new StateChangeEventHandler(OnStateChange)),
объявлять свое событие (public static event ConnectionEventHandler ConnectionStateChange) и выставлять его
и еще объявлять свой делегат (public delegate void ConnectionEventHandler(object sender, StateChangeEventArgs e)

Нельзя ли как-нить сразу связать событие m_Connection.StateChange
и обработчик public delegate void ConnectionEventHandler(object sender, StateChangeEventArgs e) ???

а m_Connection объявлять как public ох как не хотца.

В шарпе я недавно, так шо не бейте ногами

Thanks forward
Vad
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.