Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VB.NET动态数组中项的一行集属性_Arrays_Vb.net - Fatal编程技术网

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

Arrays VB.NET动态数组中项的一行集属性,arrays,vb.net,Arrays,Vb.net,在VB.NET中,在一行代码上,基于一些已经存在的TextBox对象动态创建一个数组,按索引选择一个TextBox,并设置其Text属性 两行中的示例: Dim textboxes = {TextBox1, TextBox2, TextBox3} textboxes(someIndex).Text = "abc" 尝试一行时出现语法错误: {TextBox1, TextBox2, TextBox3}(someIndex).Text = "abc" 只是在寻找最干净的一个班轮 我偶尔会遇到不同

在VB.NET中,在一行代码上,基于一些已经存在的
TextBox
对象动态创建一个数组,按索引选择一个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"

我能想到的最好的解决方案是将数组包装到其他调用中,例如CType()或DirectCast(),这可以工作,但其他人并不清楚它的用途

DirectCast({TextBox1, TextBox2, TextBox3}, TextBox())(someIndex).Text = "abc"

只需在初始化过程中设置属性:

Dim textboxes() As TextBox = {New TextBox() With {.Text = "abc"}, New TextBox() With {.Text = "def", 'etc...}
更新 我在你的评论中看到文本框控件已经创建;我误解了,我认为文本框控件也是动态创建的

在数组初始化期间无法执行此操作。简单地说,在创建集合之前,您无法访问集合的成员


如果我必须猜测为什么首先强制转换集合有效,可能是强制转换数组完成了初始化,允许您访问其成员。

只需在初始化过程中设置属性:

Dim textboxes() As TextBox = {New TextBox() With {.Text = "abc"}, New TextBox() With {.Text = "def", 'etc...}
更新 我在你的评论中看到文本框控件已经创建;我误解了,我认为文本框控件也是动态创建的

在数组初始化期间无法执行此操作。简单地说,在创建集合之前,您无法访问集合的成员


如果我必须猜测为什么首先强制转换集合是有效的,那么可能是强制转换数组完成了初始化,允许您访问其成员。

如果这些成员都位于表单中,您可以按名称查找它们(也就是说,假设它们都有名称
文本框#
——其中
#
是数字1、2、3,依此类推):


但是请注意,如果您给它一个索引,该索引导致一个不存在的文本框的名称,这将抛出一个
NullReferenceException

,如果这些都位于表单中,您可以按名称查找它们(也就是说,假设它们都有名称
文本框#
——其中
#
是数字1、2、3,依此类推):


但是请注意,如果您给它一个索引,导致一个不存在的文本框的名称,这将抛出一个
NullReferenceException
编辑:错误答案-这不能作为一个独立的语句!!!

这个怎么样:

(New TextBox() {TextBox1, TextBox2, TextBox3})(someIndex).Text = "abc"

编辑:错误答案-这不能作为一个独立的语句!!!

这个怎么样:

(New TextBox() {TextBox1, TextBox2, TextBox3})(someIndex).Text = "abc"

从技术上讲,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"

从技术上讲,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"

可数救命

Enumerable.ElementAt({TextBox1, TextBox2, TextBox3}, someIndex).Text = "abc"

我发现的另一个很酷的函数是
Enumerable.ElementAtOrDefault()
,如果索引超出数组的范围,它将返回数据类型的默认值(如null)。

可枚举

Enumerable.ElementAt({TextBox1, TextBox2, TextBox3}, someIndex).Text = "abc"

我发现的另一个很酷的函数是
Enumerable.ElementAtOrDefault()
,如果索引超出数组的范围,它将返回数据类型的默认值(例如null)。

我们是否可以好奇,只要我们不试图告诉您,为什么要将所有数据都放在一行上?:-)哦…你太狡猾了…如果这是我可以在一行上做而不会太混乱的事情,那么我想做,因为在精神上这是一个动作(获取第四个文本框并设置其文本).我上面失败的尝试似乎应该有效,但没有,而我认为我在C#中也做过类似的事情。听起来像是一个很好的助手函数,它可以自我记录代码正在执行的操作,并避免重复代码。我添加了另一个,并以新的
Ch的形式包含了您的想法oose()
函数。我们是否可以好奇,只要我们不想告诉您,为什么您要将所有内容都放在一行中?:-)哦。。。你真狡猾。。。如果这是我可以在一行上做而不会太混乱的事情,那么我想做,因为从精神上来说这是一个动作(获取第四个文本框并设置它的文本)。我上面失败的尝试似乎应该奏效,但没有奏效,而我认为我在C#中也做过类似的事情。听起来像是一个很好的助手函数的例子,这将有一个额外的好处,即自我记录代码正在执行的操作,并避免重复代码。我添加了另一个,并以新的
Choose()
函数的形式包含了您的想法。我正在处理已初始化的对象。我将更新问题以表明这一点。基于t