2010-05-25 56 views
0

我創建了WindowsFormControlLibrary對象。它可以正常工作,我可以將它放在窗體上,調用它的方法等等。但是現在作爲它的一個屬性,我將一個標籤的名稱傳遞給它。並且我希望此自定義控件能夠使用該標籤名稱,例如將其字體更改爲粗體。 所以問題是,如果我有一個WinForm,並且在該窗體上有一個標籤,並且在該窗體上有我的自定義控件,那麼如何告訴我的自定義控件使用該標籤進行某些操作,我將其名稱傳遞給它?通過我的自定義控件訪問表單上的標籤

回答

1

首先,如果您想從UserControl訪問Control,則需要使用FindForm()方法。

其次,您將被要求公開您的TextBox控件,例如,通過您的表單的屬性。

然後,您需要知道此FindForm()方法返回的此Form的類型。

一旦你知道它,你需要輸入這個結果到正確的類型。

所以,這裏的樣本未經測試的僞代碼,讓您的想法:

public partial class MyMainForm { 
    private TextBox textBox1; 

    public MyMainForm() { 
     textBox1 = new Textbox(); 
     textBox1.Name = @"textBox1"; 
     textBox1.Location = new Point(10, 10); 
     textBox1.Size = new Size(150, 23); 
     this.Controls.Add(textBox1); 
    } 

    public Font MyTextBoxFont { 
     get { 
      return textBox1.Font; 
     } set { 
      if (value == null) return; 
      textbox1.Font = value; 
     } 
    } 
} 

然後,假設你有你的表格上下降了你的控制,你UserControl可能有一個屬性,像這樣:

public partial class MyUserControl { 
    private Form GetContainerForm { 
     get { 
      return this.FindForm(); 
     } 
    } 

    // And later on, where you need to set your TextBox's font: 
    private void SetContainerInputFieldFont(Font f) { 
     if (GetContainerForm == null) return; // Or throw, depending on what you need to do. 

     ((MyMainForm)GetContainerForm).MyTextBoxFont = f 
    } 
} 
2

不是發送標籤的名稱,而是發送對實際標籤的引用,然後自定義控件可以在需要時讀取名稱並更改標籤的字體和其他屬性。

不過要小心,它可以迅速變得一團糟跟蹤,如果各種形式和控制更改其他形式等

編輯控件發生的事情的:增加了代碼,做你的意見要求什麼

代碼沒有經過測試,因此它可能不完全正確,但類似的東西應該工作。

foreach (Control c in Parent.Controls) 
{ 
    if (c is Label) 
    { 
     Label l = (Label)c; 
     // do stuff to label l 
    }        
} 
+0

有沒有一種方法可以調用FindContorl或類似的東西? – Bohn 2010-05-25 18:47:07

+0

或甚至更好:向此控件添加一個屬性,可以枚舉其包含窗體上的所有標籤?那麼我們可以在設計時選擇其中的一個... – Bohn 2010-05-25 18:50:27

+0

當然,我會用代碼示例更新我的答案。 – 2010-05-25 19:00:18

0

酷:)我剛剛添加了一個獲取類型爲Label的公共屬性...它自動列出了窗體上的所有標籤。

相關問題