none
關於放在Form裡面物件名稱有辦法可以用指令來取得嗎? RRS feed

  • 問題

  • 我在某種場合上(目前用在跟三菱PLC溝通)會常常使用到Form裡面的物件。
    比方說常用的物件btnM0000~btnM9999(Button物件)、txtD0000~txtD9999(TextBox物件)、lblW0000~lblWFFFF(Lable物件)等等,因為這些物件的名稱有一定的規律。
    現在的問題是,我要如何將上述有使用到的物件在該Form裡面如何用指令找出這些物件名存在矩陣裡面。
    因為每個Form的物件有可能使用0000~9999流水號,且時常修改物件的流水號。

    比方說Form A裡面有使用到btnM0000、btnM7430、btnM1428、lblW342C、lblW7FFF這些物件變數,那我要如何將這些變數名稱讀出,舉例搜尋btnM????,用哪個指令可得到M0000、M1428、M7430。
    同理FormB、C、D、.....因為有很多重複性的工作,所以真的很需要這個指令。
    小弟 剛學VB.NET 兩個多月,請各位前輩幫忙 謝謝


    2009年4月28日 上午 03:05

解答

  • Hi, ken
    for your reference

           ''舉所有的"control",menustrip相關的不會被列出
            For Each c As Control In Me.Controls
                Debug.Print(c.GetType.Name & "," & c.Name)
            Next
    
           ''尋找某control,許多"容器"都有提供Controls.Find的方法,例如panel,可以利用將相關control放在容器
            ''裡面藉此縮小搜尋範圍
            Dim Result() As Control
            Result = Me.Controls.Find("Button" & "1", True)
            If (Result IsNot Nothing) AndAlso (Result.Length > 0) Then
                Debug.Print(CType(Result(0), Button).Text)
            End If

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Lolota Lee 2009年4月28日 上午 09:15
    2009年4月28日 上午 06:41
    版主

所有回覆

  • ken:
        請參閱  MSDN文件庫
        [Control.ControlCollection 類別]
        [Control.ControlCollection.Find 方法 ]
        論壇有一篇[以變數表示label名稱] 你也可以參考一下
    2009年4月28日 上午 03:22
    版主

  • 我試了好幾次,都出現錯誤
    MSDN上的範例寫的太少了,不知道有沒有可以成功的範例

    Visual Basic (宣告)
    Public Function Find ( _
        key As String, _
        searchAllChildren As Boolean _
    ) As Control()
    
    Visual Basic (使用方式)
    Dim instance As Control..::.ControlCollection
    Dim key As String
    Dim searchAllChildren As Boolean
    Dim returnValue As Control()
    
    returnValue = instance.Find(key, searchAllChildren)
    


    上述是從MSDN上擷取下來的。
    查了資料後,大概知道key是指要找name的字串。searchAllChildren設定ture/flase好像是指被包含各物件下是否要搜尋。

    那請問instance是什麼?
    另外我有Form1與Form2那要怎麼區別。
    MSDN上面有語法,但是有可以執行的範例嗎。上次找某個指令也吃了很多虧。花了一堆時間才知道有變數沒設定到。 明明有些語法可以表示清楚一些,那初學者更可以馬上適應。

    下面是我看過上述的語法寫的,當然如期的出現一堆錯誤。

    Public Class Form1
        Dim instance As Control..::.ControlCollection
        Dim key As String
        Dim searchAllChildren As Boolean
        Dim returnValue As Control()
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            key = "Button2"
            searchAllChildren = True
            returnValue = instance.Find(key, searchAllChildren)
            MsgBox(returnValue)
        End Sub
    End Class


    視窗:
    Form1面板上有Button1,Button2,Button3,Button4,Button9 按鍵
    組譯後就出現錯誤。我以前學過C,最近才來學VB2008不到兩個月。感覺上MSDN上面語法真的是很不詳細。
    還是小弟剛入門,看不習慣MSDN上面的語法?







    2009年4月28日 上午 05:59
  • Hi, ken
    for your reference

           ''舉所有的"control",menustrip相關的不會被列出
            For Each c As Control In Me.Controls
                Debug.Print(c.GetType.Name & "," & c.Name)
            Next
    
           ''尋找某control,許多"容器"都有提供Controls.Find的方法,例如panel,可以利用將相關control放在容器
            ''裡面藉此縮小搜尋範圍
            Dim Result() As Control
            Result = Me.Controls.Find("Button" & "1", True)
            If (Result IsNot Nothing) AndAlso (Result.Length > 0) Then
                Debug.Print(CType(Result(0), Button).Text)
            End If

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Lolota Lee 2009年4月28日 上午 09:15
    2009年4月28日 上午 06:41
    版主
  • Dear bauann:
    問題解決了 ^^
    但是有一個問題。
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.controlcollection.find.aspx
    MSDN這邊提供文法,那初學者的我要怎麼樣去實現這個範例文法(至少可以執行,初學者就可修改範例使用)。
    是否要朝什麼方向去尋找實現的方式,因為每一次都問別人也覺得會不太好意思。

    這次是有兩位大大幫我 抓到魚,我相望下一次能夠自己抓到魚  ^^
    那有什麼方式可讓初學者看懂MSDN上面的文法。





    在這邊也謝謝    Bill Chung大大提供的資料
    2009年4月28日 上午 07:29
  • Visual Basic (使用方式)
    Dim instance As Control..::.ControlCollection
    Dim key As String
    Dim searchAllChildren As Boolean
    Dim returnValue As Control()
    
    returnValue = instance.Find(key, searchAllChildren)

    MSDN上描述的使用方法如上
    其實只要看粗體的那行
    而instance代表物件實體
    通常要New出物件或是從別的地方取出物件實體參考
    像Me.Controls就是ControlCollection的實體
    因此照上面的使用方法
    我們把instance代換成Me.Controls
    其他參數自行代換
    就會變成
    Dim Result() As Control
    Result = Me.Controls.Find("Button" & "1", True)


    http://www.dotblogs.com.tw/larrynung/
    2009年4月28日 上午 08:55
  • Dear bauann:
    問題解決了 ^^
    但是有一個問題。
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.controlcollection.find.aspx
    MSDN這邊提供文法,那初學者的我要怎麼樣去實現這個範例文法(至少可以執行,初學者就可修改範例使用)。
    是否要朝什麼方向去尋找實現的方式,因為每一次都問別人也覺得會不太好意思。

    這次是有兩位大大幫我 抓到魚,我相望下一次能夠自己抓到魚  ^^
    那有什麼方式可讓初學者看懂MSDN上面的文法。





    在這邊也謝謝    Bill Chung大大提供的資料

    Hi, ken
    其實我是覺得MSDN的文件是需要去習慣的,他有固定的編排模式在,查多了就比較會抓到重點;以上面你提到部分這部分
    Public Class Form1
        Dim instance As Control..::.ControlCollection
        Dim key As String
        Dim searchAllChildren As Boolean
        Dim returnValue As Control()
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            key = "Button2"
            searchAllChildren = True
            returnValue = instance.Find(key, searchAllChildren)
            MsgBox(returnValue)
        End Sub
    End Class

    其中..:.這個部分是網頁展示產生的問題,正常在VB裡面不會有這樣的東西,正確的應該是Control.ControlCollection,而該頁面中主要是說明Control.ControlCollection的Find方法使用方式,第一行有提到

    根據 Name 屬性搜尋控制項,並建置所有相符之控制項的陣列。

    從這邊可以知道要搜尋的時候要用控制項的Name屬性做為搜尋的條件,再來看到下面第一部分的程式碼
    Public Function Find ( _
        key As String, _
        searchAllChildren As Boolean _
    ) As Control()

    這是說明Find方法的存取層級是Public的,必須傳入兩個參數key、searchAllChildren,而傳回值是一個control 陣列;再往下
    Dim instance As Control.ControlCollection
    Dim key As String
    Dim searchAllChildren As Boolean
    Dim returnValue As Control()

    returnValue = instance.Find(key, searchAllChildren)

    這邊是展示Control.ControlCollection的使用方法,但是遺憾的是,當你完全按照這樣的方式去做的時候還是做不出來的,你會遇到"尚未將物件參考設定為物件的執行個體"這個在.net中常見的錯誤訊息,為什麼呢?主要是這個頁面主要是在說明,並非完整的範例,他沒有將instance做初始化,也沒有在這個集合物件中加入任何的控制項。

    再來要去找有實作ControlCollection的控制項/類別,所以最後就看到了Me.Controls.Find這樣的使用方式,至於為什麼會知道有Me.Controls這個東東,這就要多去看了,找到適合你自己的學習方式,這是很重要的;看你自己是喜歡看書,還是爬文或其他等等,以我自己來說,我是喜歡看書跟在論壇上面看文章,有興趣的就抓下來做一下,也可以看到其他前輩提供的相關資料等等,另外Visual Studio的自動提示(說明)做的相當完整,當你想要知道一個控制項裡面有提供哪些東西可以用,就輸入控制項的執行個體名稱加上"點"之後(例如Me.),一個一個看,都有對應的說明,很方便的。

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年4月28日 上午 11:35
    版主
  • Dea all:
    感謝這邊的前輩們!
    讓我有辦法開始慢慢的自己抓魚 ^^

    尤其是 bauann前輩更是將自己的學習方式告訴我。如果小弟自己要懂MSDN的看法的話 還要再多花幾個月吧
    現在找資料比較有頭緒了,手頭上有一本入門的書。還有外加上MSDN的資料庫,這樣就方便多了。
    至於為什麼MSDN對我滿重要的,而我一值很想要了解他。那是因為2008VB的書還沒有很多,尤其是硬體實作方面的(RS232,socket,USB等等)

    不過還是要謝謝前輩們 提供我寶貴的入門經驗 ^^
    2009年4月29日 上午 05:58