none
失落的 控制項陣列 RRS feed

  • 問題

  • in VB2005 + .Net framework 2.0

     

    以前在 VB6 時控制項可以做成陣列,某些時候還滿方便的,例如:

     

     一口氣對一堆控制項設定屬性:

     

     '假設有已佈置了 10 個 TextBox,陣列索引 0~9,一次要對它們做 Text 的指定,則:

     For i = 0 To 9

         MyTextBox(i).Text = "這是第 " & CStr(i + 1) & " 個文字方塊"

     Next

     

     '但,到了 VB.Net,控制項陣列不見了.....像這樣的需求時,只能自己 Key 10行程式碼

     MyTextBox0.Text = "這是第 " & CStr(1) & " 個文字方塊"

     MyTextBox1.Text = "這是第 " & CStr(2) & " 個文字方塊"

     MyTextBox2.Text = "這是第 " & CStr(3) & " 個文字方塊"

     .....

     .....

     .....

     ......累@.@

     

     

    還有還有,上述的還不是重點,更重要的是,在 UserControl 中:

    「清單式」的 UserControl 的屬性......

     

     '一樣假設有 TextBox 10個,陣列索引 0~9,則它們的 Property 可以這樣:

     Public Property Get MyValue(index As Integer) As String
         MyValue = Text1(index).Text
     End Property

     Public Property Let MyValue(index As Integer, ByVal New_Value As String)
         Text1(index).Text = New_Value
     End Property

     

     '但,到了 VB.Net,控制項陣列不見了,只得這樣:

     Public Property MyValue(ByVal index As Integer) As String
         Get
             Select Case index
                 Case 0 : Return TextBox1.Text
                 Case 1 : Return TextBox2.Text
                 Case 2 : Return TextBox3.Text

                 .....

                 .....

                 .....
             End Select
         End Get
         Set(ByVal value As String)
             Select Case index
                 Case 0 : TextBox1.Text = value
                 Case 1 : TextBox2.Text = value
                 Case 2 : TextBox3.Text = value

                 .....

                 .....

                 .....
             End Select
         End Set
     End Property

     

    這裡只是 10 個,若有 30 個、50 個的話豈不是.....@.@  甚至若有以程式碼動態新增或刪除控制項的時候...都不敢想囉~~

     

    想問的是:在沒有「控制項陣列」可用的情形,真的只能這樣嗎?還有有什麼變通的方式?

     

     

    謝謝~

    2008年3月11日 上午 03:39

解答

  • 看你的回應好像沒看懂相關討論...

     

    並沒有一定要用集合物件,也可以用陣列。

     

    繼承 CollectionBase 應該是要做成新的控制項,而非從既有控制項去處理,一般是不這樣處理的。

     

    一般來說,大量的控制項通常動態產生,則動態產生時,直接加入集合物件或是宣告成 TextBox() 這種陣列亦可。

     

    手動繪製的,也可以宣告一個集合物件或陣列,在 Form_Load 加入,這邊又分成三種:

    1. 直接手打程式碼加入,例如:

    Dim arrTextBox() As TextBox = New TextBox(){TextBox1, TextBox2, ...}

     

    2. 迴圈透過 Fom.Controls 找,這個碰上容器要用遞回找,假設都在 Form 下,例如:

    Dim arrTextBox(3) As TextBox

    For i = 0 To 3

       arrTextBox(i) = Me.Controls("TextBox" & i)

    Next

     

    3. 用 InvokeMember 來找子物件,這個不用管容器,只要命名空間有就可以叫用。

     

    由於 2, 3 會花較多時間,若是偶爾才用一次的,會在程式碼中直接用,若是經常用的,就會轉成陣列或集合來處理。

     

    我不知道你怎樣看文的,你說的是一條繞最遠的路。

    2008年3月11日 上午 11:53
    版主

所有回覆

  • 剛依照搜尋爬了一下文,大概知道怎麼做了。

    只是.....好像怎樣都逃不過使用 CollectionBase 類別去做喔...

    呵....只好辛苦一點了~

     

    謝謝璉璉大大敵式的搜尋喔~~

     

     

     

    2008年3月11日 上午 10:50
  • 看你的回應好像沒看懂相關討論...

     

    並沒有一定要用集合物件,也可以用陣列。

     

    繼承 CollectionBase 應該是要做成新的控制項,而非從既有控制項去處理,一般是不這樣處理的。

     

    一般來說,大量的控制項通常動態產生,則動態產生時,直接加入集合物件或是宣告成 TextBox() 這種陣列亦可。

     

    手動繪製的,也可以宣告一個集合物件或陣列,在 Form_Load 加入,這邊又分成三種:

    1. 直接手打程式碼加入,例如:

    Dim arrTextBox() As TextBox = New TextBox(){TextBox1, TextBox2, ...}

     

    2. 迴圈透過 Fom.Controls 找,這個碰上容器要用遞回找,假設都在 Form 下,例如:

    Dim arrTextBox(3) As TextBox

    For i = 0 To 3

       arrTextBox(i) = Me.Controls("TextBox" & i)

    Next

     

    3. 用 InvokeMember 來找子物件,這個不用管容器,只要命名空間有就可以叫用。

     

    由於 2, 3 會花較多時間,若是偶爾才用一次的,會在程式碼中直接用,若是經常用的,就會轉成陣列或集合來處理。

     

    我不知道你怎樣看文的,你說的是一條繞最遠的路。

    2008年3月11日 上午 11:53
    版主
  • 補充:

    若是宣告為 Object 或是直接用集合物件,則可混用各種物件,比如說 Label, TextBox 都放進來跑回圈。

     

    2008年3月11日 上午 11:56
    版主
  • 喔,了解了~

    這樣的話單純的多了~~

    呵..不好意思喔~我總是黜眼黜眼的.....

     

    謝謝啦~~

     

     

     

    2008年3月13日 上午 11:14