2010-09-01 132 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; 
}