我试图循环访问一组ComboBox,并使用连接的字符串& variable来设置一个属性,以表示控件的名称。但是,我无法使窗体示例将(String & Integer_Variable)识别为它的一个控件--因此它无法将任何适当的属性或子例程识别为System. Windows. Forms. Control的成员。
我找到了DirectCast solution on SO,它看起来可以工作(尽管我对此表示怀疑),但这似乎是一个非常笨拙的解决方案。有没有更干净的方法来做到这一点?
For myTempCount = 1 To 6
If tempValue < Me.("ComboBox" & myTempCount).Items.Count Then
ComboBox.SelectedIndex = tempValue 'appears to work -- how?
Me.ComboBox.SelectedIndex = tempValue 'appears to work
Me.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work
Me.Controls.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work
DirectCast(Me.Controls.Find(("ComboBox" & myTempCount), True)(0), ComboBox).SelectedIndex = tempValue 'appears to work
DirectCast(Me.Controls("ComboBox" & myTempCount), ComboBox).SelectedIndex = tempValue 'appears to work
Next
这段代码最初是VBA /VB 6,我把它放在ArtinSoft的Visual Basic升级伴侣(VBUC)中。FWIW,我使用的是Microsoft Visual Basic 2010 Express。
6条答案
按热度按时间umuewwlo1#
要回答您的问题:
ComboBox1.SelectedIndex
之所以有效,是因为ComboBox1是窗体的ControlCollection中存在的控件Me.ComboBoxPrinter1.SelectedIndex
之所以有效,是因为Me是对Form类的引用,并且它引用了Control。Me.("ComboBoxPrinter" & myTempCount).SelectedIndex
不起作用,因为字符串ComboBoxPrinter & myTempCount
是字符串而不是控件。Me.Controls.("ComboBoxPrinter" & myTempCount).SelectedIndex
由于同样的原因不起作用。1.其他两个执行严修之所以能运作,是因为您使用字串做为索引键,以查阅和传回您转换为适当型别并设定属性的控件。
我个人通常使用CType而不是DirectCast。根据这个link,CType和DirectCast之间的主要区别是DirectCast必须是CType可以用于缩小或扩大转换的确切类型。DirectCast更有效,尽管更挑剔。
也就是说,你可以这样做:
我没有在控件前面使用Me,因为它引用了同一个集合,如果您的控件在另一个集合中,您将需要使用该容器。例如,如果您使用的是Panel
Panel1.Controls.ContainsKey
chhqkbe12#
哎哟!!!我曾经搞砸过Direct Cast。我记得那是一场噩梦。我的偏好是要么坚持使用服务器端控件,要么把它们写成客户端Javascript/ AJAX 。在你上面的代码中,它在哪里失败了?有没有内部异常?
rqcrx0a63#
也许您可以尝试以下代码(C#):
下面是使用在线工具将上述代码转换为VB .NET:
我希望这对你有帮助!
9avjhtql4#
我再次遇到了这个问题,有多个不同类型的控件需要对一个公共属性(如
.Text
)执行相同的操作。由于不能使用变量来表示CType()
中的控件类型参数,因此必须使用一个条件和相应的硬编码CType()
命令来获取控件。下面是我想到的方法:controlName
是串接的字符串名称。因此,您可以使用与前面的答案CType()
几乎相同的方法来使用此函数:aoyhnmkz5#
大概是这样的:
oknrviil6#