2010-09-01 112 views
1

嘿,所有我想弄清楚如何去創建我的表單上的動態複選框,當我不知道我會需要多少箱子axacctly。vb.net動態創建複選框

問題是我不知道如何DIM多個對象。這是我創建一個複選框代碼

Dim checkBox As New CheckBox() 

Form1.Controls.Add(checkBox) 
checkBox.Location = New Point(10, 10) 
checkBox.Text = "testing" 
checkBox.Checked = True 
checkBox.Size = New Size(100, 20) 

它工作得很好,但我無法添加多個複選框,而不必這樣做:

Dim checkBox As New CheckBox() 
Dim checkBox2 As New CheckBox() 

Form1.Controls.Add(checkBox) 
checkBox.Location = New Point(10, 10) 
checkBox.Text = "testing" 
checkBox.Checked = True 
checkBox.Size = New Size(100, 20) 

Form1.Controls.Add(checkBox2) 
checkBox2.Location = New Point(40, 10) 
checkBox2.Text = "testing2" 
checkBox2.Checked = True 
checkBox2.Size = New Size(100, 20) 

等等

有沒有辦法使多個複選框變暗而不必爲每個CheckBoxe編寫多個暗淡語句?

對不起,也許我應該說這個..

我希望做這樣的事情:

dim checkBox() as CheckBox 

do until i = 50 
    Form1.Controls.Add(checkBox(i)) 
    checkBox(i).Location = New Point(10, 10) 
    checkBox(i).Text = "testing " & i 
    checkBox(i).Checked = True 
    checkBox(i).Size = New Size(100, 20) 
    i += 1 
loop 

大衛

回答

5

好像是不同的,CheckBox實例之間沒有計算是唯一的項目文本。如果是這樣,那麼你可以使用下面的代碼來添加一組基於String列表的CheckBox實例。

Dim data as String() = New String() { "testing", "testing2" } 
Dim offset = 10 
For Each cur in data 
    Dim checkBox = new CheckBox() 
    Form1.Controls.Add(checkBox) 
    checkBox.Location = New Point(offset, 10) 
    checkBox.Text = cur 
    checkBox.Checked = True 
    checkBox.Size = New Size(100, 20) 
    offset = offset + 30 
Next 
+0

那就是我正在尋找的,但是,它只在你的例子中循環一次,當它應該循環兩次? – StealthRT 2010-09-01 18:11:50

+0

@StealthRT,它查找'data'數組中的每個值。 – JaredPar 2010-09-01 18:12:18

+0

正確,它確實表示data = 2,但它應該有2個時在窗體上只有一個複選框(測試)? – StealthRT 2010-09-01 18:13:39

0

把它放在一個循環,包括新的聲明,但改變了立場。

你也可以克隆該對象,也許與性能處罰...對不起,但不知道Vb.net,我會給你的C#代碼希望它會類似。我認爲這不是你的案例的最佳解決方案(一個循環會做的伎倆),但也許這將是一個有類似但更通用的問題的人。

CheckBox CB2 = (CheckBox)CloneObject(CheckBox1); 

//改變這裏的位置... Form1.Controls.Add(checkBoxCB2)

private object CloneObject(object o) 
{ 
    Type t = o.GetType(); 
    PropertyInfo[] properties = t.GetProperties(); 

    Object p = t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null); 

    foreach(PropertyInfo pi in properties) 
     { 
     if(pi.CanWrite) 
      { 
       pi.SetValue(p, pi.GetValue(o, null), null); 
      } 
     } 

    return p; 
}