2013-11-22 94 views
0

考慮一個使用VS2010創建的空WinForms應用程序。控制器在設計器中消失

它與下面的代碼自定義的TextBox類:

Public Class DummyTextBox : Inherits TextBox 
    Private Const FONT_SIZE As Single = 14.25! 
    Private Const FONT_FAMILY As String = "Microsoft Sans Serif" 

    Private Sub Me_ParentChanged(sender As Object, 
           e As System.EventArgs) Handles Me.ParentChanged 
    'this one does not work, it causes designer 
    'to lose its controls once in a while 
    Me.Font = New Font(Me.Parent.Font.FontFamily, FONT_SIZE) 
    'if I use a constant value instead, like below, it works fine 
    'Me.Font = New Font(FONT_FAMILY, FONT_SIZE) 
    End Sub 
End Class 

因此,基本上增加字體大小,相同的家庭作爲父窗體文本框。

發生什麼事情是,放在窗體上,然後構建後,控件有時會從設計器視圖中消失。如果你運行這個項目,它通常會顯示正常。關閉/重新打開一個表單,並重新顯示。

但是,有時候,控件會完全消失(我無法在100%的時間內重現),因此您必須重新添加並設置屬性。如果將多個控件放在一個鏡頭中,通常只有其中一個會消失。在窗體上移動後,控件更可能會消失。

發生了什麼事?

回答

1

根據我的研究,Me.Parent有時可以NothingParentChanged,所以該行拋出一個異常,這是永遠不會顯示給用戶(它只發生在設計時)。圍繞它放置一個Try/Catch有助於驗證這一事實。它看起來像Windows窗體設計器喜歡分離控制並將其附加回自己的判斷。

要解決該問題,需要驗證是否存在父級,然後才設置Font

所以更改此:

Me.Font = New Font(Me.Parent.Font.FontFamily, FONT_SIZE) 

要這樣:

Dim parent As Control = Me.Parent 
If parent Is Nothing Then Return 
Me.Font = New Font(parent.Font.FontFamily, FONT_SIZE) 

使問題消失,以任何方式不影響運行。