none
如何變數取代 Form 中非特定元件的名稱 RRS feed

  • 問題

  • 假設在vb2005 中, 如果要修改 Form1 中一個 Textbox元件的 Text 屬性內容(設這個 textbox 名稱是 Textbox1), 我們都可以很容易的用下列一行指令去修改, 例如 :

    Textbox1.text="My String"

     

    但是, 當我把這個元件的名稱存放在變數中, 想利用變數來取代直接的元件名稱, 情況似乎變的很怪異, 我嘗試用以下的指令碼, 可以正常的修改 TextBox1的Text 屬性內容  :

    Dim aa As String = "Textbox1"       

    Me.Controls(aa).Text = "My String"

     

    但是問題來了, 我發現如果Textbox1 的 Parent 是 Form1 , 上述兩行指令都可以正確執行, 但是當Textbox1 的 Parent 並不是 Form1, 而是Form1 中的某一個 Panel,  程式執行後, 系統馬上回應 aa 為 ("並未將物件參考設定為物件的執行個體") !!

     

    請問各位先進大大, 該如何的修正錯誤 ??  謝謝 ..

    2007年4月16日 下午 03:10

解答

  •  

    謝謝樓上二位的指點, 我用以下方式解決, 不管控制元件放在任何一個地方都可以 :

     

    Dim Ctrl As Control = Nothing
      Ctrl = FindControl("Label1")
            If Not Ctrl Is Nothing Then
                Ctrl.Text = "My String"
            End If

     


        Public Function FindControl(ByVal CtrlName As String) As Control
            FindControl = Nothing
            Dim Result As Control() = Me.Controls.Find(CtrlName, True)
            If Result.Length > 0 Then
                FindControl = Result(0)
            End If
        End Function

     

     

    2007年4月17日 上午 07:14

所有回覆

  • Hi,

    Me這個關鍵字代表的是執行個體本身,通常指的就是Form;而當你將TextBox放到Panel裡面的時候,Form(Me)便無法直接操作到TextBox應該要透過Panel的Controls屬性去操作,例如

    Dim S As String = "TextBox1"
      Me.Panel1.Controls(S).Text = "123"

    以上給您參考。

    2007年4月17日 上午 01:46
  • 參考一下吧

    Code Snippet VB
    <Description("尋找物件")> _
      Public Shared Function FindControl(ByVal controlBox As Control, ByVal controlName As String) As Control
       Dim ReturnControl As Control =  Nothing
       Dim cl As Control
       For Each cl In controlBox.Controls
        If cl.Name.Equals(controlName) Then
         ReturnControl = cl
         Exit For
        End If
        If cl.Controls.Count > 0 Then
         If Not(ReturnControl = FindControl(cl,controlName)) Is Nothing Then
          Exit For
         End If
        End If
       Next
     
       Return ReturnControl
      End Function

     

    2007年4月17日 上午 03:07
  •  

    謝謝樓上二位的指點, 我用以下方式解決, 不管控制元件放在任何一個地方都可以 :

     

    Dim Ctrl As Control = Nothing
      Ctrl = FindControl("Label1")
            If Not Ctrl Is Nothing Then
                Ctrl.Text = "My String"
            End If

     


        Public Function FindControl(ByVal CtrlName As String) As Control
            FindControl = Nothing
            Dim Result As Control() = Me.Controls.Find(CtrlName, True)
            If Result.Length > 0 Then
                FindControl = Result(0)
            End If
        End Function

     

     

    2007年4月17日 上午 07:14