4

私は簡単な連絡帳を持っています。アプリケーションには、mdi フォームのメイン ウィンドウがあります。「連絡先の追加」フォームを使用して連絡先を追加すると、連絡先が正常に追加されたことを示す簡単なフィードバック メッセージを親ウィンドウのステータス バーに表示したいと考えています。

子の読み込みは次のとおりです。

Private Sub addButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addButton.Click
    Dim af As New addForm
    af.MdiParent = Me
    af.Show()
End Sub

問題は、親が実際には mdi の親であり、「連絡先の追加」フォームが.Show()の代わりに.ShowDialog()起動されるため、起動する Sub がアクションを実行するために使用できる戻り値を保存できないことです。

この子から mdi 親に値を渡す方法はありますか? これは、それを行う子フォームです。

Private Sub addButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addButton.Click

    Dim contact = <contact>
                      <quickName><%= quickNameTextBox.Text %></quickName>
                      <firstName><%= firstNameTextBox.Text %></firstName>
                      <lastName><%= lastNameTextBox.Text %></lastName>
                      <email><%= emailTextBox.Text %></email>
                      <website><%= websiteTextBox.Text %></website>
                      <telephone><%= telephoneTextBox.Text %></telephone>
                      <mobile><%= mobileTextBox.Text %></mobile>
                  </contact>

    Dim contactList = XDocument.Load("contactList.xml")

    contactList.Elements()(0).Add(contact)
    contactList.Save("contactList.xml")
    //something here to trigger the status update in the parent?
    //trivia: SO doesn't support VB single-quote comments...
    Me.Close()

End Sub

PSどうやら、私は物事にタグを付けるのがかなり苦手です...そのため、この質問に再タグ付けしたい人は誰でも大歓迎です。

4

6 に答える 6

1

VB.NETでは、[My]名前空間を使用できます。My.Forms。[MDIフォームの名前]だから...メインフォームがMdiMainと呼ばれている場合は、次のようなことができます。

My.Forms.MdiMain.lblStatus = "X"

すべての子フォームは同じ基本クラスを継承し、そのクラスにはMy.Forms.MdiMainを返すプロパティがあります。私はそれをMdiParentFormと呼びました。そうすれば、任意のフォームとバムでMe.MdiParentFormと言うことができます...それが親です。(入力が少ない)

于 2009-07-09T20:38:26.370 に答える
1

これが最も簡単な答えです。イベントはありません。

状況 : 1 つの MdiParent フォーム (Form1) と 2 つの子コントロール フォーム (Control1Form および Control2Form)。起動時に、MdiParent に子コントロール (control1 と control2) が作成されます。

Form1 には、StatusLabel という名前の StatusStrip のラベルがあります。Control2 には Button1 という名前のボタンがあります

目的: Control2 のボタンがクリックされると、Control2 は control1 の Title と Form1 の StatusLabel に書き込みます。

PARTIAL CODE

FORM1
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
control1 = New Control1Form
control2 = New Control2Form
control1.MdiParent = Me
control1.Show()
control2.MdiParent = Me
control2.Show()
End Sub
End Class


CONTROL2FORM
Public Class Control2Form
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
'Title of Control1
CType(Me.ParentForm, Form1).control1.Text = "Title bar text"
'Status Strip Label
CType(Me.ParentForm, Form1).StatusLabel.Text = "Status Strip Text"
End Sub
End Class

そして出来上がり!それが役に立てば幸い

于 2010-07-29T18:20:46.247 に答える
0

ジョンの答えは非常に役に立ちますが、不完全です。そして、欠落している部分は、私のような初心者に混乱を引き起こす可能性があります.

最初に行ったように addForm を暗くする代わりに、WithEvents キーワードを使用してクラス レベルで addForm のインスタンスを作成し、このインスタンスを使用してフォームとイベント ハンドラの両方をロードする必要があります。

Private WithEvents oneAddForm As New addForm //create a new instance of addForm

Private Sub addButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addButton.Click
    oneAddForm.MdiParent = Me
    oneAddForm.Show()
End Sub
//using this instance to load the form...

Private Sub updateStatus(ByVal sender As System.Object, ByVal contactName As String) Handles oneAddForm.addSuccess
    statusLabel.Text = contactName & " has been added to your contact list."
End Sub
//...and to put in the event handler

しかし、これにより、一度閉じた後に oneAddForm フォームを読み込もうとすると、「破棄されたオブジェクトにアクセスできません...」という例外が発生します。

于 2009-02-19T16:38:35.493 に答える
-1

私にとってはうまくいった、少し異なる答えを追加したいと思います。

MDI親でコードを変更している限り、上記の回答からの以下はうまくいきました。form1.MDIparent=me に相当するものを貼り付けたところ、すべてが失敗しました。だから私はそのステップを残しました。

以下の Form1 は、使用している MDI 親フォームの名前である必要があります。次に、変数を親に渡したり、親の他の機能を追跡したりするのに最適な環境で機能します。

これを行う前に、すべてのフィールドが空白である別の親に子供が電話をかけるという問題がありました!!

CType(Me.ParentForm, Form1).control1.Text = "Title bar text"
'Status Strip Label
CType(Me.ParentForm, Form1).StatusLabel.Text = "Status Strip Text"

CType(Me.parentForm, Form1).variableDefinedinParentString = "abc" 'passing a variable

CType(Me.parentForm, Form1).subroutineLOCATEDinPARENT() 'Calling a subroutine in the parent

多分これは他の人を助けるでしょう。そうだといい!

于 2015-05-08T22:16:20.840 に答える