Как Вы инициировали событие через классы?

Я пишу Библиотеку классов, которая будет использоваться другими приложениями. Я пишу это в C#.NET. У меня есть проблема с инициирующими событиями через классы. Вот то, что я должен сделать...

public class ClassLibrary
{
    public event EventHandler DeviceAttached;

    public ClassLibrary()
    {
        // do some stuff
        OtherClass.Start();
    }
}

public class OtherClass : Form
{
    public Start()
    {
        // do things here to initialize receiving messages
    }

    protected override void WndProc (ref message m)
    {
       if (....)
       {
          // THIS IS WHERE I WANT TO TRIGGER THE DEVICE ATTACHED EVENT IN ClassLibrary
          // I can't seem to access the eventhandler here to trigger it.
          // How do I do it?

       }
       base.WndProc(ref m);
    }

}

Затем в приложении, которое использует библиотеку классов, я сделаю это...

public class ClientApplication
{
    void main()
    {
       ClassLibrary myCL = new ClassLibrary();
       myCL.DeviceAttached += new EventHandler(myCl_deviceAttached);
    }

    void myCl_deviceAttached(object sender, EventArgs e)
    {
         //do stuff...
    }
}
5
задан PICyourBrain 22 February 2010 в 20:51
поделиться

4 ответа

Триггеры MySQL не могут управлять таблицей, которой они назначены. Все другие основные СУБД поддерживают эту функцию, поэтому, надеюсь, MySQL скоро добавит эту поддержку.

http://forums.mysql.com/read.php?99, 122354 240978 # msg-240978

-121--2885088-

См. реализацию pyodbc - Python Database API Specification v2.0 . Отлично работает.

Кроме того, ее можно использовать с другими базами данных. При использовании с SQL Server 2008 следует использовать собственный драйвер, если требуется поддержка новых типов данных DATE .

-121--1461396-

Я думаю, что вы должны изменить свою точку зрения на то, как работают события. OtherClass должен «владеть» событием и инициировать его. ClassLibrary или ClureApplication (в зависимости от того, что выбрано) «прослушивает» событие, подписываясь на него, и выполняет определенное действие при возникновении этого события.

Как это реализовать:

public class ClassLibrary
{
    public OtherClass myOtherCl;

    public ClassLibrary()
    {
        myOtherCl= new OtherClass();
        myOtherCl.Start();
    }
}

Инициируйте событие в классе, где оно логически происходит, где оно обнаруживается.

public class OtherClass : Form
{
    public event EventHandler DeviceAttached;

    public Start()
    {
        // do things here to initialize receiving messages
    }

    protected override void WndProc (ref message m)
    {
       if (....)
       {
          OnDeviceAttach();
       }
       base.WndProc(ref m);
    }

        public void OnDeviceAttach()
        {
            if (DeviceAttached != null)
                DeviceAttached ();
        }

}

Наконец, тот, кто должен слушать событие, нуждается в доступе к экземпляру класса, проводящего событие, поэтому myOtherCl был обнародован в этом примере.

public class ClientApplication
{
    void main()
    {
       ClassLibrary myCL = new ClassLibrary();
       myCL.myOtherCl.DeviceAttached += new EventHandler(myCl_deviceAttached);
    }

    void myCl_deviceAttached(object sender, EventArgs e)
    {
         //do stuff...
    }
}
1
ответ дан 13 December 2019 в 19:26
поделиться

Обработчики событий могут быть вызваны только непосредственно классом, который их объявил. Если вам нужно вызвать ClassLibrary.DeviceAttached не из этого класса, вам нужно добавить вспомогательный метод вроде следующего:

public void OnDeviceAttached()
{
    DeviceAttached();
}
1
ответ дан 13 December 2019 в 19:26
поделиться

Вы не можете этого сделать. События можно вызывать только из класса, в котором объявлено событие.

Обычно, вы добавляете метод в свой класс для поднятия события и вызываете этот метод:

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 
    public void NotifyDeviceAttached()
    {
       // Do processing and raise event
     }

Затем, в другом коде, вы просто вызываете myCL.NotifyDeviceAttached();

8
ответ дан 13 December 2019 в 19:26
поделиться

Возможно, вы вообще не захотите использовать событие здесь. Это чрезмерное упрощение, но обычно событие - это то, что поднимается дочерним компонентом, когда ему нужно сообщить что-то своему родителю. В вашем случае (я делаю вывод из вашего кода) ваша форма ожидает определенного сообщения (когда устройство подключено?), и когда она обнаруживает это сообщение, ей нужно сообщить об этом myCL. Для этого достаточно создать метод в ClassLibrary и вызвать его из формы.

1
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: