VB.NET 动态数组中项的单行集属性



在 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"

最新更新