2012-08-23 47 views
0

我創建了一個具有選項卡式控件的表單,可以將用戶控件動態添加到每個選項卡,並在表單底部添加一個StatusStrip。當應用程序啓動時,基於安全性將用戶控件加載到選項卡中,並加載至少1個選項卡。在StatusStrip上,兩個ToolStripComboBoxes,兩個ToolStripButtons,一個ToolStripLabel和一個ToolStripStatusLabel。一切都很好,工作。VB.Net:動態創建MonthCalendar不會觸發LostFocus或GotFocus

當用戶按下兩個按鈕之一時,我已經獲得了MonthCalendar彈出窗口。下面是我用來做這個代碼:

If IsNothing(theCal) Then 
    theCal = New MonthCalendar 
    AddHandler theCal.DateSelected, AddressOf theCalDateSelected 
    AddHandler theCal.LostFocus, AddressOf theCalLostFocus 
    AddHandler theCal.GotFocus, AddressOf theCalLostFocus 
    theCal.Parent = Me 
    theCal.Top = StatusStripMain.Top - theCal.Height 
    theCal.Left = ComboBoxAvailableLegDay.Bounds.X 
    theCal.Anchor = AnchorStyles.Bottom + AnchorStyles.Left 
    theCal.Show() 
    theCal.BringToFront() 
    theCal.Focus() 
Else 
    Me.Controls.Remove(theCal) 
    theCal = Nothing 
End If 

截至窗體類的頂部保護腱鞘定義。因此,按下按鈕將創建MonthCalendar並將其正確放置,如果它不存在,並且它確實存在,則將其刪除。這工作沒有問題。

我的問題是,卡爾永遠不會激發GotFocus或LostFocus。我已經獲得了過程theCalLostFocus定義如下,它從不會拋出異常。我可以在投擲中放置一個斷點,並且代碼永遠不會達到這一點。

Private Sub theCalLostFocus(ByVal sender As Object, ByVal e As EventArgs) 
    Throw New NotImplementedException 
End Sub 

點擊腱鞘的日期將調用theCalDateSelected程序,但點擊形式的其他區域不火theCalLostFocus。由於用戶可能不想選擇一個日期,我不想強​​迫他們不得不按下按鈕來刪除該日期,我希望能夠在失去焦點時移除日期。任何人都知道爲什麼會發生這種情況,任何人都有解決方案?

謝謝。 -NCGrimbo

回答

1

我沒那麼驚訝的是,焦點事件將不火,因爲你插入它在視覺上樹前添加處理程序。嘗試在調用show()之後添加處理程序。或者可能在加載的事件處理程序中。請注意,由於您請求焦點,因此您的焦點事件處理程序將每次都被調用。

Rq:就像它寫的,你的代碼有內存泄漏,因爲當你清除Cal時你並沒有移除事件處理程序,所以既然引用保存在Cal中,那麼Cal和事件處理程序都不會被清除,內存泄漏(循環參考)。

+0

我將AddHandler語句移到了Cal.Show()之後的行中,並且沒有發現行爲上的變化。 (並且我添加了刪除事件處理程序的每個註釋。) – NCGrimbo

+0

我只注意到(Got/Lost)焦點事件處理程序的簽名不正確。它應該是一個路由事件:(ByVal sender As Object,ByVal e As RoutedEventArgs) – GameAlchemist

+0

當我調用RoutedEventArgs時,出現錯誤:鍵入'RoutedEventArgs'未定義。 – NCGrimbo

相關問題