Я знаю, что это было давно, но, кажется, довольно популярная тема с множеством повторяющихся вопросов. Теперь у меня была похожая ситуация, когда у меня был класс, который вызывался из других классов со многими отдельными потоками, и мне приходилось обновлять одну конкретную форму из всех этих других потоков. Поэтому создание обработчика события делегата было ответом.
Решение, которое сработало для меня:
Я создал событие в классе, который я хотел обновить в другой форме. (Сначала я создал экземпляр формы (названной SubAsstToolTipWindow
) в классе.)
Затем я использовал это событие (ToolTipShow
) для создания обработчика событий в форме, на которой я хотел обновить метку. Работал как шарм.
Я использовал это описание для разработки своего собственного кода ниже в классе, который выполняет обновление :
public static class SubAsstToolTip
{
private static SubAsstToolTipWindow ttip = new SubAsstToolTipWindow();
public delegate void ToolTipShowEventHandler();
public static event ToolTipShowEventHandler ToolTipShow;
public static void Show()
{
// This is a static boolean that I set here but is accessible from the form.
Vars.MyToolTipIsOn = true;
if (ToolTipShow != null)
{
ToolTipShow();
}
}
public static void Hide()
{
// This is a static boolean that I set here but is accessible from the form.
Vars.MyToolTipIsOn = false;
if (ToolTipShow != null)
{
ToolTipShow();
}
}
}
Тогда код в моей форме , который был обновлен :
public partial class SubAsstToolTipWindow : Form
{
public SubAsstToolTipWindow()
{
InitializeComponent();
// Right after initializing create the event handler that
// traps the event in the class
SubAsstToolTip.ToolTipShow += SubAsstToolTip_ToolTipShow;
}
private void SubAsstToolTip_ToolTipShow()
{
if (Vars.MyToolTipIsOn) // This boolean is a static one that I set in the other class.
{
// Call other private method on the form or do whatever
ShowToolTip(Vars.MyToolTipText, Vars.MyToolTipX, Vars.MyToolTipY);
}
else
{
HideToolTip();
}
}
Надеюсь, это поможет многим из вас все еще сталкиваться с такой же ситуацией.