在 VB.NET 中,在一行代码上,基于一些已经存在的TextBox
对象动态创建一个数组,按索引选择一个文本框,并设置其Text
属性。
两行示例:
Dim textboxes = {TextBox1, TextBox2, TextBox3}
textboxes(someIndex).Text = "abc"
尝试一行时出现语法错误:
{TextBox1, TextBox2, TextBox3}(someIndex).Text = "abc"
只是在寻找最干净的单行本。
我偶尔会遇到不同形式的这种情况。 我使用文本框使问题更简单。 它可以是不是控件且名称不同的对象,例如:
{itemDefault, itemFromSql, itemFromXml}(someIndex).SomeProperty = someValue
(而且我并没有要求理由来制作不止一行代码。
我能想到的最好的解决方案是将数组包装在其他一些调用中,例如 CType(( 或 DirectCast((,它可以工作,但其他人不清楚它的目的。
DirectCast({TextBox1, TextBox2, TextBox3}, TextBox())(someIndex).Text = "abc"
可枚举的救援!
Enumerable.ElementAt({TextBox1, TextBox2, TextBox3}, someIndex).Text = "abc"
我发现的另一个很酷的函数是 Enumerable.ElementAtOrDefault()
,如果索引超出数组范围,它会返回数据类型的默认值(例如 null(。
如果它们都位于表单中,您可以按名称查找它们(即,假设它们都具有名称 TextBox#
- 其中#
是数字 1、2、3 等(:
Me.Controls.Find("TextBox" & (someindex + 1), True)(0).Text = "abc"
但请注意,如果为其提供一个索引,导致文本框的名称不存在,这将引发NullReferenceException
。
只需在初始化期间设置属性:
Dim textboxes() As TextBox = {New TextBox() With {.Text = "abc"}, New TextBox() With {.Text = "def", 'etc...}
更新我在您的评论中看到文本框控件已经创建;我误解了,我以为文本框控件也是动态创建的。
在数组初始化期间无法执行此操作。简而言之,在创建集合之前,无法访问集合的成员。
如果我不得不猜测为什么首先强制转换集合有效,可能是强制转换数组完成了初始化,允许您访问其成员。
从技术上讲,VB 的 Choose()
函数可以工作,除了它有一个与某些古老版本的 BASIC 向后兼容的恶臭,因为它的索引是从 1 开始的,并且出于某种原因数据类型为 Single... 而且它的返回对象也必须包装在CType或DirectCast中。
一个基于石头的建议的解决方案,即创建一个包装函数,并且还密切而通用地模仿VB的Choice()
函数:
Public Shared Function Choose(Of T)(index As Integer, ParamArray choice As T()) As T
Return choice(index)
End Function
然后可以这样调用:
Choose(someIndex, TextBox1, TextBox2, TextBox3).Text = "abc"
编辑:糟糕的答案 - 这不能作为独立的语句使用!!
这个怎么样:
(New TextBox() {TextBox1, TextBox2, TextBox3})(someIndex).Text = "abc"