Я пишу Библиотеку классов, которая будет использоваться другими приложениями. Я пишу это в 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...
}
}
Триггеры 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
.
Я думаю, что вы должны изменить свою точку зрения на то, как работают события. 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...
}
}
Обработчики событий могут быть вызваны только непосредственно классом, который их объявил. Если вам нужно вызвать ClassLibrary.DeviceAttached
не из этого класса, вам нужно добавить вспомогательный метод вроде следующего:
public void OnDeviceAttached()
{
DeviceAttached();
}
Вы не можете этого сделать. События можно вызывать только из класса, в котором объявлено событие.
Обычно, вы добавляете метод в свой класс для поднятия события и вызываете этот метод:
public class ClassLibrary
{
public event EventHandler DeviceAttached;
public void NotifyDeviceAttached()
{
// Do processing and raise event
}
Затем, в другом коде, вы просто вызываете myCL.NotifyDeviceAttached();
Возможно, вы вообще не захотите использовать событие здесь. Это чрезмерное упрощение, но обычно событие - это то, что поднимается дочерним компонентом, когда ему нужно сообщить что-то своему родителю. В вашем случае (я делаю вывод из вашего кода) ваша форма ожидает определенного сообщения (когда устройство подключено?), и когда она обнаруживает это сообщение, ей нужно сообщить об этом myCL
. Для этого достаточно создать метод в ClassLibrary
и вызвать его из формы.