none
[vb2005]textbox與迴圈 RRS feed

  • 問題

  • 1.假設已先拉好10個textbox,若我想檢查這些是否為空

    只用IF的話...

    程式碼區塊

    If textbox1.text="" Or textbox2.text="" Or textbox3.text="" Or  ......  then

    條件式會很大一串!!

     

    怎麼使用迴圈去逐個判斷?? (假設textbox的name會有順序 ex: tb1,tb2,tb3,...,etc)

    例如 希望像這樣...

    程式碼區塊

    For i = 1 to 10

      If textbox(i).text="" then Msgbox(i)  '條件應該怎麼打@@?

    end For

     

     

     

    2.若textbox改成...程式執行後才知道要產生多少個的話,又該怎麼使用迴圈去判斷呢?

    程式碼區塊

    For i = 1 to X  '產生X個

      Dim tb as New Textbox

      tb.name= "tb" & i           '又如果name這邊名字都一樣會產生什麼後果?

      '...假設每個Location都會設好

    end For

     

     

     

    觀念不是很清楚,希望能指導一下^^"  謝謝。

    2007年11月25日 下午 06:50

解答

  • 程式碼區塊

                foreach (Control c in Controls)
                {
                    if (c is TextBox)
                    {
                        if (c.Text == "")
                        {
                            // do something
                        }
                        else
                        {
                            // do the others
                        }
                    }
                }

     

     

     

    2007年11月26日 上午 12:56
  • Name 不能給一樣的。

     

    ex.

    程式碼區塊

    Dim colTextBoxs As New Collection

    For i As Integer = 0 To 10

       Dim strName = "TextBox" & i

       Dim ctlTextBox As New TextBox

       colTextBoxs.Add(ctlTextBox, strName)

       ctlTextBox.Name = strName

       ...

    Next

     

     

     

    大量的文字和通常搭配 TableLayoutPanel 容器來排列

    所以通常在 Next 前會用

    TableLayoutPanel.Controls.Add(ctlTextBox, 欄數, 列數) ,若是直接加在 Form 上,要自行計算位置。

     

    你也可以在 Form_Load 時,把既存物件依照上面的方式加入陣列或集合物件,後面就直接用該集合物件,不用再搜尋:

    程式碼區塊

    Dim colTextBoxs As New Collection

    For i As Integer = 0 To 10

       Dim strName = "TextBox" & i

       colTextBoxs.Add(Me.Controls(strName), strName)  

    Next

     

     

     

    這樣對於修改現有程式會比較快。
    2007年11月26日 上午 03:52
    版主
  • Hi,

    我自己本身的做法是把TextBox放到容器裡面(一般是用Panel),之後可以利用容器的特性對容器中的控制項做操作,例如

    For each c as control in me.panel1.controls

    if ctype(c,TextBox).Text="" then

    ...

    end if

    Next

    做法跟之前樓上先進提的是一樣的,只是放在容器裡面可以不用掃過所有在Form裡面的控制項,參考看看。 

     

    2007年11月26日 上午 04:16
    版主

所有回覆

  • 程式碼區塊

                foreach (Control c in Controls)
                {
                    if (c is TextBox)
                    {
                        if (c.Text == "")
                        {
                            // do something
                        }
                        else
                        {
                            // do the others
                        }
                    }
                }

     

     

     

    2007年11月26日 上午 12:56
  • object.Controls 包含容器 object 上所有的控制項,你可以透過此方式處理或取出。

    例如控制項的個數:Me.Controls.Count

    例如 TextBox1 可用 Me.Controls("TextBox" & 1)

     

    通常大量的文字盒產生時,通常會直接用程式碼動態產生,則程式碼可以直接用陣列或集合物件處理。

     

    2007年11月26日 上午 01:19
    版主
  • 先謝謝以上兩位指導!

     

    另外請問璉大

    動態產生textbox,則程式碼可以直接用陣列集合物件處理

    能有sample code 參考怎麼使用嗎?

    若動態產生時,name都給一樣會有什麼後果?

     

    謝謝。

    2007年11月26日 上午 03:34
  • Name 不能給一樣的。

     

    ex.

    程式碼區塊

    Dim colTextBoxs As New Collection

    For i As Integer = 0 To 10

       Dim strName = "TextBox" & i

       Dim ctlTextBox As New TextBox

       colTextBoxs.Add(ctlTextBox, strName)

       ctlTextBox.Name = strName

       ...

    Next

     

     

     

    大量的文字和通常搭配 TableLayoutPanel 容器來排列

    所以通常在 Next 前會用

    TableLayoutPanel.Controls.Add(ctlTextBox, 欄數, 列數) ,若是直接加在 Form 上,要自行計算位置。

     

    你也可以在 Form_Load 時,把既存物件依照上面的方式加入陣列或集合物件,後面就直接用該集合物件,不用再搜尋:

    程式碼區塊

    Dim colTextBoxs As New Collection

    For i As Integer = 0 To 10

       Dim strName = "TextBox" & i

       colTextBoxs.Add(Me.Controls(strName), strName)  

    Next

     

     

     

    這樣對於修改現有程式會比較快。
    2007年11月26日 上午 03:52
    版主
  • Hi,

    我自己本身的做法是把TextBox放到容器裡面(一般是用Panel),之後可以利用容器的特性對容器中的控制項做操作,例如

    For each c as control in me.panel1.controls

    if ctype(c,TextBox).Text="" then

    ...

    end if

    Next

    做法跟之前樓上先進提的是一樣的,只是放在容器裡面可以不用掃過所有在Form裡面的控制項,參考看看。 

     

    2007年11月26日 上午 04:16
    版主