2011-05-12 61 views
1

我有一個可以產生幾個非模態子窗體的窗體上的用戶控件。孩子形成用戶可以編輯的顯示數據。用戶控件顯示相同數據的不同視圖,並且如果用戶在一個或多個子窗體中進行了更改,我希望能夠重新生成數據的重新加載。我已經設置了一些事件來通知用戶對子表單中數據更改的控制,但我無法確定應該在用戶控件上捕獲哪些事件(如果存在),以確定它是否已從兒童表格。我可以在這裏使用現有的活動嗎?用戶控件獲得焦點時發現的事件?

編輯:代碼示例 (對不起,我的客戶喜歡VB)

的GotFocus似乎只在用戶控件設置爲觸發。

我的控制面板添加「主」形式是這樣的:

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 

然後,有一個「關閉」按鈕用戶控件將事件觸發回主窗體,然後將該用戶控件從面板中移除並進行處理。只有當mainControl.Dispose()被叫GotFocus火。

EDIT 2
我只是想處理Enter事件,但只有觸發第一次,而不是每一個控件接收焦點時。

回答

2

我能找到的最好方法是處理用戶控件中父窗體的Activated事件。根據我在過去幾個小時中所做的所有研究,我瞭解到GotFocus是一件棘手的事情,Winforms用戶控件根本不喜歡聚焦,因爲它是一個容器控件。說我有一個加載到一個名爲「MyControlParentForm」形式的用戶控件MyUserControl,當時我正在使用的代碼是這樣的:

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

c#中有一個名爲Control.GotFocus事件的事件。在.net 2.0之前不存在。

+0

我爲此添加了一個處理程序,當它在控件和子窗體之間來回切換時,它不會觸發。我需要做什麼才能讓GotFocus開火? – 2011-05-12 16:26:54

+0

請參閱此處:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.gotfocus.aspx中的示例。隨意發佈代碼它仍然不會觸發。 – soandos 2011-05-12 16:29:19

+0

GotFocus僅在用戶控件處理時觸發。查看原始帖子中的代碼示例。謝謝! – 2011-05-12 17:07:43

0

我這樣的詭計。

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

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

這個事件並沒有像你期望的那樣開火。如果您有重疊的用戶控制,並且一個在另一個之前,就此事件而言,可見性保持不變。只有處置控件才能觸發此事件,與GotFocus相同。 – 2015-11-16 14:13:52

相關問題