none
請問按鈕點選後開新 form 如何傳參數 RRS feed

  • 問題

  • 我在一個 FORM 中 按下按鈕會 CALL 一個新的 FORM (程式片斷如下)

    希望 call 時可以將 U_DEPTID 與 U_DEPTNAME 的值傳入 , 顯示在被 call 的 form 的 textbox 內

    Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
            DIM U_DEPTID AS STRING  = "TEST1"
            DIM U_DEPTNAME  AS STRING = "TEST2"
            Using fm1 As New fmDeptUpdate   '使用 USING CALL FORM
                With fm1
                    .Update_DEPTID =U_DEPTID
                    .Update_DEPTNAME = U_DEPTNAME
                    If .ShowDialog() <> Windows.Forms.DialogResult.Yes Then
                        Exit Sub
                    End If
                    _DEPTID = .Update_DEPTID
                    _DEPTNAME = .Update_DEPTNAME
                End With
            End Using

    '以下為被 CALL 的 FORM的程式碼 , form 只有兩個 textbox 與兩個 button--確認,取消

    Public Class fmDeptUpdate
        Public Property Update_DEPTID As String
        Public Property Update_DEPTNAME As String
        '確定
        Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
            Me.Update_DEPTID = Me.txtDeptID.Text.Trim
            Me.Update_DEPTNAME = Me.txttxtDeptNAME.Text.Trim
            Me.DialogResult = Windows.Forms.DialogResult.Yes
            Me.Close()
        End Sub
        '取消
        Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
            Me.DialogResult = Windows.Forms.DialogResult.Cancel
            Me.Close()
        End Sub
    End Class

    請問要如何修改才能傳入 ? 謝謝

    2015年9月10日 上午 09:34

解答

  • (1) Visual Basic 對於畫面控制項預設的Modifiler 是 Friend, 所以在同一個 Assembly 的狀況下, 沒有修改為 public 的需要

    (2) 把控制項的存取權整個暴露其實也不是件好做法.

    (3) 你其實有將值傳過去, 只是你傳給了自訂的屬性後就沒有繼續的動作了.  所以你有幾種方式可以做

    (3-1) 如同 tihs 的作法, 把值直接傳給控制項的 Text 屬性 (但不需要修改 Modifiler)

    (3-2) 傳給自訂屬性, 由自訂屬性修改控制項的屬性值

    Public Class fmDeptUpdate
    
        Public Property Update_DEPTID As String
            Get
                Return txtDeptID.Text
            End Get
            Set(value As String)
                txtDeptID.Text = value
            End Set
        End Property
        Public Property Update_DEPTNAME As String
            Get
                Return txttxtDeptNAME.Text
            End Get
            Set(value As String)
                txttxtDeptNAME.Text = value
            End Set
        End Property
    
    
        Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
            Me.Update_DEPTID = Me.txtDeptID.Text.Trim
            Me.Update_DEPTNAME = Me.txttxtDeptNAME.Text.Trim
            Me.DialogResult = Windows.Forms.DialogResult.Yes
            Me.Close()
        End Sub
    End Class
    當然這有更多的作法, 你可以搜尋論壇看看其他的討論


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2015年9月11日 上午 04:47
    版主

所有回覆

  • 你好,有幾種方式:

    1.委派(Delegate)方式。

    2.在 form2 定義類別屬性。

    3.在調用 form2 時,使用建構子方式也能傳。

    http://www.dotblogs.com.tw/joysdw12/archive/2013/06/21/delegate-winfom.aspx

    http://www.dotblogs.com.tw/yc421206/archive/2009/02/16/7206.aspx

    2015年9月10日 下午 12:26
  • 您可以放在fmDeptUpdate的txtDeptID和txttxtDeptNAME這兩個TextBox的Modifiers屬性改成Pulbic, 然後將

     With fm1
                    .Update_DEPTID =U_DEPTID
                    .Update_DEPTNAME = U_DEPTNAME

    改成:

     With fm1
                    .txtDeptID.Text=U_DEPTID
                    .txttxtDeptNAME.Text= U_DEPTNAME

    應該就可以了


    • 已編輯 tihsMVP 2015年9月11日 上午 03:04
    2015年9月11日 上午 03:04
  • (1) Visual Basic 對於畫面控制項預設的Modifiler 是 Friend, 所以在同一個 Assembly 的狀況下, 沒有修改為 public 的需要

    (2) 把控制項的存取權整個暴露其實也不是件好做法.

    (3) 你其實有將值傳過去, 只是你傳給了自訂的屬性後就沒有繼續的動作了.  所以你有幾種方式可以做

    (3-1) 如同 tihs 的作法, 把值直接傳給控制項的 Text 屬性 (但不需要修改 Modifiler)

    (3-2) 傳給自訂屬性, 由自訂屬性修改控制項的屬性值

    Public Class fmDeptUpdate
    
        Public Property Update_DEPTID As String
            Get
                Return txtDeptID.Text
            End Get
            Set(value As String)
                txtDeptID.Text = value
            End Set
        End Property
        Public Property Update_DEPTNAME As String
            Get
                Return txttxtDeptNAME.Text
            End Get
            Set(value As String)
                txttxtDeptNAME.Text = value
            End Set
        End Property
    
    
        Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
            Me.Update_DEPTID = Me.txtDeptID.Text.Trim
            Me.Update_DEPTNAME = Me.txttxtDeptNAME.Text.Trim
            Me.DialogResult = Windows.Forms.DialogResult.Yes
            Me.Close()
        End Sub
    End Class
    當然這有更多的作法, 你可以搜尋論壇看看其他的討論


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2015年9月11日 上午 04:47
    版主
  • 感謝各位的相助 , 誠如 Bill 所述 ,

    問題應該是出現在 其實有將值傳過去, 只是你傳給了自訂的屬性後就沒有繼續的動作

    也就是如tihs 的作法, 把值直接傳給控制項的 Text 屬性 

    因為沒做這個動作 , 一直以為值沒傳過去 , 感謝各位一語驚醒夢中人

    2015年9月11日 上午 07:41
  • 你如果是固定要新增參數,可以增加 Form New(參數, 參數2...) 覆寫

    然後用

    Dim newForm As New Form2(參數1, 參數2...)


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2015年9月11日 下午 01:16