none
回覆:mdiform下如何呼叫某個未知名的childform的某個sub? RRS feed

  • 問題

  • 我用的是vb.net 2005定義了一個mdiform1,其中mdiform1上面有一個toolbar1,這個toolbar1上有兩個buttton,這兩個button分別是tbb_new,tbb_save

    其中單擊mdiform1的tbb_new按鍵發生事件如下:

    Public Class mdiform1

        Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            '查詢條件
            If e.Button Is tbb_new Then
                    For Each ChildForm As Form In Me.MdiChildren
                        Childform.ck_search_click()  -------------------此行出錯!

                Next
            End If
    End sub

    End Class

    我開了一個childform,名字叫e_cmc_big_kind,e_cmc_big_kind有一個sub,這個childform已經處於active狀態下(已經show),代碼如下:

    Public Class e_cmc_big_kind
        Private Sub ck_search_Click(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles ck_search.Click
            MsgBox("查詢條件開始測試!")
        End Sub
    End Class

    一般情況下如果知道childform的名字是e_cmc_big_kind情況下直接在出錯那一行寫

     e_cmc_big_kind.ck_search_click()就可以了,

    然而請問在不知道childform名字情況下如何取得childform的名字且成功呼叫childform的sub?如何寫這行代碼?

     

     

    2006年12月12日 上午 07:31

解答

  • Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            '查詢條件
            If e.Button Is tbb_new Then
                    For Each ChildForm As Form In Me.MdiChildren

                         Dim args() As [Object] = {sender, e}

                         ChildForm.GetType().InvokeMember("ck_search_Click", _
                         BindingFlags.Public Or BindingFlags.Instance, _
                         Nothing, ChildForm,  args)    
                  

                            Next
               End If
    End sub

    2006年12月17日 上午 01:55
    版主
  • HI,

    您可以這樣做:

    For Each ChildForm As Form In Me.MdiChildren

        If ChildForm.GetType().Name="ChildForm類別名稱" Then

            CType(ChildForm, ChildForm類別名稱).ck_search_click()

        End if

    Next

    就可以達到您的目的了

    tihs

    2006年12月17日 上午 08:41

所有回覆

  • 你可能要用到 Type.InvokeMember() 來做。
    以你的程式碼就是 Childform.GetType().InvokeMember(....) (參數請查詢 .NET Framework SDK 文件)
    2006年12月12日 上午 07:42
    版主
  • 大大能否明確一點啊?我已經困擾很久了!
    2006年12月12日 上午 07:54
  • Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            '查詢條件
            If e.Button Is tbb_new Then
                    For Each ChildForm As Form In Me.MdiChildren

                         Dim args() As [Object] = {sender, e}

                         ChildForm.GetType().InvokeMember("ck_search_Click", _
                         BindingFlags.Public Or BindingFlags.Instance, _
                         Nothing, ChildForm,  args)    
                  

                            Next
               End If
    End sub

    2006年12月17日 上午 01:55
    版主
  • HI,

    您可以這樣做:

    For Each ChildForm As Form In Me.MdiChildren

        If ChildForm.GetType().Name="ChildForm類別名稱" Then

            CType(ChildForm, ChildForm類別名稱).ck_search_click()

        End if

    Next

    就可以達到您的目的了

    tihs

    2006年12月17日 上午 08:41
  • 這只有在所有 ChildForm 都是同一種類別才能用 ...
    不然還是得用 InvokeMember(),只要物件內有指定的函數就可以執行 .
    2006年12月17日 下午 02:49
    版主
  • 何為 ChildForm類別名稱?

    何為 類別名稱?

    2006年12月19日 下午 11:45
  • HI,

    如果是Form的話, 當初您指定的Form的檔案名稱的主檔名就是預設的類別名稱. 類別名稱是一種型態, 可以用來宣告變數

    tihs

    2006年12月20日 上午 12:05