2010-02-05 70 views
0

有一種簡單的方法來編程設置的控制屬性值,使得其將在設計器生成的代碼被持久化?我想象一下在控制構造函數或加載事件中的一段代碼,當我在設計模式下打開控件時,它會執行,但設置一個屬性,使得它將以與手動更改值相同的方式設置屬性網格。通過編程設置設計時屬性中Windows.Forms的控制

編輯:是的,這將是一樣的手動編輯設計器代碼,但我想以編程方式做到這一點。

+0

你就不能編輯設計文件? –

+0

你的意思是說,當你重新運行這個程序時它會被重新更改? –

回答

0

你覺得是這樣的:

if (this.DesignMode) 
{ 
    // do somthing 
} 

如果你把這個給構造記()之前調用的InitializeComponent。

1

。假定我明白的問題

您可以在屬性數據綁定到一個設置,使用Visual Studio GUI。檢查該控件的屬性,在Data部分下爲(Application Settings),(Property Bindings)

1

這取決於你想要什麼樣的功能。如果您只需要在將控件添加到窗體時設置屬性,那麼在控件的構造器中設置屬性就可以很好地工作。但是,使用「屬性」面板進行的更改將優先,並且在控件的構造函數中設置屬性不一定會影響控件的現有實例。

如果你希望能夠改變屬性控制的情況下,在一個地方,在(應用程序設置)指定綁定(屬性綁定)的作品。然後您可以修改Settings.settings文件中的所有綁定。儘管如此,仍然需要爲每個控件實例分配屬性綁定。

現在的結局。如果您想在控件的類中設置影響控件所有實例的屬性,這些實例是否尚未創建或已存在,則必須獲得一點創意。我找到了一個解決方案,但它可能不是最好的。我的解決辦法是這樣的:

在控件的構造函數,你要設置的每個屬性,您:

  1. 存放在私有變量所需的值。
  2. 將該變量的值分配給該屬性。
  3. 分配一個事件處理程序,該屬性發生更改時將該變量的值分配給該屬性。

一個缺點是編碼爲每個屬性的量。此外,您將無法從「屬性」窗格更改屬性。

0

什麼:

Private Function GetPropertyByName(ByVal propName As String) _ 
As PropertyDescriptor 
    Dim prop As PropertyDescriptor 
    prop = TypeDescriptor.GetProperties(l_dWindow)(propName) 
    If prop Is Nothing Then 
     Throw New ArgumentException(_ 
     "Matching ColorLabel property not found!", propName) 
    Else 
     Return prop 
    End If 
End Function 

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click 
    GetPropertyByName("AnyPublicProperty").SetValue(AnyControl, "AnyStringVALUE") 
    Me.DialogResult = DialogResult.OK 
End Sub