2013-04-03 225 views
0

運行期間我一直在創造一些controls像下面設置修飾符:動態創建的控件

pnl1.Controls.Add(New TextBox() With _ 
{ 
    .Name = "ItemName", _ 
    .Anchor = AnchorStyles.Left + AnchorStyles.Right _ 
} 

我試圖設置其改性劑Public。不幸的是我所有的嘗試都失敗了。
我的問題是:我們可以爲動態創建的控件設置修改器嗎?

如果不是,那麼我怎樣才能訪問其他forms中的那些controls? (例如:Form1具有動態創建的控件ctrl1,Form2,其存在於Form1MDI container內)。

如何從Form2訪問ctrl1? (沒有form1設置public改良劑ctrl1我們無法從Form2訪問它像這樣me.parentform.ctrl1

回答

1

當不dinamically,該控件Friend With Events,在Vb.NET,宣佈將它們添加到之前在Visual Studio套默認形成。你可以做同樣的事情,申報一個公共List(Of Control)(例如),並在你創建它們時添加你的控件。

甚至更​​好,Dictionary(Of String, Control)通過其名稱訪問控件。

或者您可以從窗體中獲取它們。使用Form1.Controls,您可以訪問表單中的所有控件。如果你的控制是另一個控制裏面,你需要達到的控制是控制內,例如:

Dim btn As Label = Ctype(Form1.Controls("GroupBox1").Controls("Label1"), Label) 
+0

+1 Nice Solution。我會試試這個,讓你知道這是否有效。 –

+0

哎呀抱歉,忘記接受它作爲我的答案。我一直在使用你的想法。你建議我使用公共列表(控制),但我稍微修改它。我所做的是在運行期間,我將我的控件添加到面板中,該面板具有修改器作爲公共。不管怎樣,謝謝。 –

2

你缺少,該訪問修飾符在那裏時在編譯時描述窗體類,不運行。訪問修飾符不是一種安全機制!

例如,將3 TextBox es添加到表單中。給他們訪問修飾符Private,現在創建窗體的實例,並運行下面的代碼:

Dim form as Form1 

For Each c As Control In form.Controls 
    MessageBox.Show(c.Name) 

您將獲得3點MessageBox上課,告訴你3個TextBox ES的名字,即使他們的訪問修飾符Private。到Public不同的是,你不能寫這樣的代碼:

MessageBox.Show(form.TextBox1.Name) 

您不能訪問私有成員這樣一類的。但是,編譯時可以使用成員。他們和班級一起申報。在這種情況下,它們簡化了對Control的訪問。

在運行期間向表單添加控件將而不是在類中創建一個新成員!它不能,因爲你的類將不得不被修改,重新編譯,重新生成等等。

結論

  1. 聲明你的會員Private並不妨礙對象訪問控制他們 封裝。
  2. 在運行時創建控件不會影響類。
  3. 您正在尋找設計模式,如MVCMVVM
+0

+1謝謝一些很好的建議。 –