簡體   English   中英

VB.NET動態數組中項目的單線設置屬性

[英]VB.NET one-liner set property on item in dynamic array

在VB.NET中,在一行代碼上,基於一些已經存在的TextBox對象動態創建一個數組,按索引選擇一個文本框,並設置其Text屬性。

兩行示例:

Dim textboxes = {TextBox1, TextBox2, TextBox3}
textboxes(someIndex).Text = "abc"

嘗試一行語法錯誤:

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

只尋找最干凈的單線。

我偶爾會遇到不同的形式。 我使用TextBox來簡化問題。 可能是不是控件且名稱不相似的對象,例如:

{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)。

只需在初始化期間設置屬性:

Dim textboxes() As TextBox = {New TextBox() With {.Text = "abc"}, New TextBox() With {.Text = "def", 'etc...}

更新我在您的評論中看到TextBox控件已經創建; 我誤會了,我以為TextBox控件也是動態創建的。

在數組初始化期間,您將無法執行此操作。 簡而言之,在創建集合之前,您無法訪問集合的成員。

如果我不得不猜測為什么強制轉換集合首先起作用,則可能是強制轉換數組完成了初始化,從而允許您訪問其成員。

如果這些都位於表單中,則可以按名稱查找它們(也就是說,假設它們都具有名稱TextBox# -其中#是數字1、2、3,依此類推):

Me.Controls.Find("TextBox" & (someindex + 1), True)(0).Text = "abc"

但是請注意,如果為它提供一個導致文本框名稱不存在的索引,則將拋出NullReferenceException

編輯:錯誤的答案-這不能作為獨立的語句!!!

這個怎么樣:

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

從技術上講,VB的Choose()函數可以工作,除了它的臭味是可以向下兼容某些古老的BASIC版本,因為它的索引是基於1的,並且由於某種原因它的數據類型是Single ...以及它的返回對象必須包裝在CType或DirectCast中...

基於解決方案的stone建議創建包裝函數,並且還緊密通用地模仿了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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM