[英]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.