Событие, чтобы определить, когда пользовательский элемент управления получает фокус? - PullRequest
1 голос
/ 12 мая 2011

У меня есть пользовательский элемент управления на форме, который может порождать несколько немодальных дочерних форм. Дочерние формы отображают данные, которые пользователь может редактировать. Пользовательский элемент управления отображает другое представление тех же данных, и я хочу иметь возможность порождать перезагрузку данных, если пользователь внес изменения в одну или несколько дочерних форм. У меня уже есть события, настроенные для уведомления пользовательского элемента управления об изменениях данных в дочерних формах, но я не могу выяснить, какое событие (если оно существует) я должен зафиксировать на пользовательском элементе управления, чтобы определить, что оно вернуло фокус с дочерняя форма (ы). Есть ли существующее событие, которое я могу использовать здесь?

РЕДАКТИРОВАТЬ: Пример кода (извините, мой клиент любит VB)

Похоже, что GotFocus срабатывает только при утилизации UserControl.

Я добавляю элемент управления на панель в «основной» форме следующим образом:

Dim mainControl as New MainUserControl()
Panel1.Controls.Add(mainControl)
mainControl.Doc = DocStyle.Fill
mainControl.Visible = True
mainControl.Show()

Затем код обработчика события:

Private Sub MainUserControl_GotFocus(ByVal sender as Object, ByVal e as EventArgs) Handles Me.GotFocus
    MessageBox.Show("got focus")
End Sub

Затем на пользовательском элементе управления есть кнопка «Закрыть», которая отправляет событие обратно в основную форму, которая затем удаляет пользовательский элемент управления с панели и удаляет его. GotFocus срабатывает только при вызове mainControl.Dispose().

РЕДАКТИРОВАТЬ 2
Я только что попытался обработать событие Enter, но оно срабатывает только в первый раз, а не каждый раз, когда элемент управления получает фокус.

Ответы [ 3 ]

2 голосов
/ 12 мая 2011

Лучший способ сделать это, я могу найти, обработав событие родительской формы Activated в пользовательском элементе управления. Из всех исследований, которые я провел за последние несколько часов, я узнал, что с GotFocus сложно работать, а пользовательский элемент управления Winforms вообще не любит фокусироваться, потому что это контейнер. контроль. Скажем, у меня есть пользовательский элемент управления MyUserControl, который загружается в форму с именем «MyControlParentForm», тогда код, который я использую, выглядит примерно так:

Private Sub MyUserControl_Load(ByVal sender as Object, ByVal e As EventArgs) Handles MyBase.Load
    Dim parent = TryCast(ParentForm, MyControlParentForm)
    If parent IsNot Nothing Then
        AddHandler parent.Activated, AddressOf Control_Activated
    End If
End Sub

Private Sub Control_Activated(ByVal sender As Object, ByVal e as EventArgs)
    Debug.WriteLine("activated")
End Sub

Затем, если форма по какой-либо причине теряет фокус и затем восстанавливает ее, MyUserControl узнает об этом через Control_Activated. Надеюсь, это поможет кому-то в будущем.

1 голос
/ 12 мая 2011

В c # есть событие, называемое Control.GotFocus Event. не существует до .net 2.0.

0 голосов
/ 04 июля 2015

Я обманул вот так.

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);

    if (Disposing == false)
    {
        if (Visible == true)
        {
            // OnShown(e);
        }
        else
        {
            // OnHide(e);
        }
    }
}
...