2014-02-27 92 views
0

假設我有兩種形式,即Form1Form2。 Form1中包含動態創建DataGridView控制和Form2包含兩個Textbox控件(Textbox1Textbox2)Button控制。如何將值從一種形式傳遞給另一種形式的動態創建的控件

當我DoubleClickDataGridView的細胞它將打開Form2和從當前選擇的單元中的數據傳遞到Form2Textbox1

下面是代碼:

我添加了一個handlear到我的動態創建的DataGridView這樣的:

 

    AddHandler dg.CellMouseDoubleClick, AddressOf dg_DataGridEdit 

 

    Private Sub dg_DataGridEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 
       Dim dgView As DataGridView = DirectCast(sender, DataGridView) 
     Form2.TextBox1.Text = dgView.CurrentCell.Value.ToString() 
       Form2.ShowDialog() 
    End Sub 

當我點擊從窗體2的按鈕,當前選擇的單元格的值將改變像TextBox2中從窗體2具有。但問題是我不能使用從From2 button1的代碼,如

 

    Form1.dgView.CurrentCell.Value = TextBox2.Text 

如何將值從textbox2傳遞到當前選定的單元格?

回答

0

好吧,我明白了。 起初,我創建了一個叫做

 

    Public UpdateData As String = "" 

然後,更改代碼 -

 
    Private Sub dg_DataGridEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 

       Dim dgView As DataGridView = DirectCast(sender, DataGridView) 
       Form2.TextBox1.Text = dgView.CurrentCell.Value.ToString() 
       Form2.ShowDialog() 
       dgView.CurrentCell.Value =UpdateData 
       UpdateData="" 
    End Sub 

在窗口2

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     form1.UpdateData = TextBox2.Text 
     Me.Hide() 
    End Sub 

0

您可以通過Form2的構造函數將Form1的datagridview傳遞給Form2。然後,您可以像訪問最後一段代碼片段一樣訪問Form1的datagridview的CurrentCell

你可以在Form2中有一個構造函數,它將datagridview作爲參數。

Public Class Form2 

    Private dgView As New DataGridView 
    Public Sub New(ByRef _dgView As DataGridView) 
     dgView = _dgView 
    End Sub 

End Class 

當您創建的Form2Form1的情況下,通過dgView到窗體2,如:

Public Class Form1 
    Dim Form2 As New Form2(dgView) 

End Class 

現在,當您單擊Form2按鈕,只需設置dgView的CurrentCell在按鈕事件處理程序如:

dgView.CurrentCell.Value = TextBox2.Text 
+0

你能解釋一些代碼嗎? –

+0

我已經更新了我的答案。謝謝! –

0

嘗試複製到剪貼板作爲解決方法,因此您不必從一個文本傳遞方法下一

System.Windows.Forms.Clipboard.SetText(...) 

System.Windows.Forms.Clipboard.GetText(...) 
+0

我認爲這可以是一個解決方案。但是,點擊Button form2後隱藏,但如何從剪貼板中獲取文本並設置爲當前單元格? –

+0

一旦數據在剪貼板中,然後像'Form1.dgView.CurrentCell.Value = System.Windows.Forms.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Text)' – TylerDurden

+1

檢索它一個糟糕的解決方案國際海事組織 - 有無需爲此使用剪貼板 –

1

當您創建的DataGridView,存儲對它的引用:

private _myDgv as DataGridView 

Sub Form_load 
    _myDgv = New dataGridView 
    Me.Controls.Add(_myDgv) 
    'etc. 
End Sub 

然後添加一個只讀屬性,從其他地方得到它的引用:

Public ReadOnly Property DynamicDgv As DataGridView 
    Get 
     Return _myDgv 
    End Get 
End Property 

然後你可以在Form2中做到這一點:

Form1.DynamicDgv.CurrentCell.Value = TextBox2.Text 
1

我不會用默認的情況下,一個公共變量。下面是每個窗體上使用一個文本框的一個示例:

Form1中

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim f As New Form2(TextBox1F1) 'pass ref to form2 
     f.ShowDialog() 
    End Sub 
End Class 

窗口2

Public Class Form2 

    Dim txtbox As TextBox 

    Public Sub New(tb As TextBox) 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     txtbox = tb 'get ref from calling form 
    End Sub 

    Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
     TextBox1F2.Text = txtbox.Text 
    End Sub 

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1F2.TextChanged 
     txtbox.Text = TextBox1F2.Text 
    End Sub 
End Class 

Form 2上以文本框的任何變化將反映在Form1中的文本框。

+0

該問題與默認表單實例無關(並且實際上,您不能解釋爲什麼您會推薦使用這些表單) –

+0

如果您使用表單的默認實例,那麼對該表單的任何更改都會將其更改爲應用程序。假設他的表單有10個字段作爲文本框,並且用戶將其填入。下一次顯示錶單時,這些文本框將具有相同的數據而不是空白。我不會使用默認實例,因爲其他許多原因,比它值得的更麻煩。 – dbasnett

+0

這是「正確」方式的一個很好的例子:http://jmcilhinney.blogspot.com.au/2013/10/managing-data-among-multiple-forms-part.html – dbasnett

相關問題