Как и Бодхо, у вас есть свойство [YourMDIForm] .ActiveMDIChild.
Что неясно, как сказал Плутоникс, где находится ваша кнопка «Сохранить». Вы имели в виду:
a Сохранить MenuItem из MenuStrip в вашей родительской форме MDI?
или кнопку Сохранить внутри формы ребенка MDI (или любой другой формы, которая не является частью родительской системы MDI/ребенка)
Первый случай достаточно прост: Используйте .ActiveMDIChild
из вашего Форма MDIParent.
может понадобиться односторонний некоторые допустимым способ указать реальную активную дочернюю форму (подобно тому, который Вы пытались с globalVar
... есть лучшие способы сделать это.
Кстати, когда вы получите свой целевой MDIChild через .ActiveMDIChild, вы должны получить доступ к текстовому полю с Public, другом или Protected переменной Обычно элементы управления в формах являются частными Таким образом, вы, возможно, придешься:..
Public Class [YourMDIChildClassName]
' ...
' create a Public Property
Public ReadOnly Property ContentToSave() As String
Get
Return [YourTextBox].Text
End Get
End Property
' or make your textbox public in the Form design
Public [YourTextBox] As TextBox
' ... the one or the other, not both.
' ...
End Class
Другим способом доступа к «активному» MDIChild , Предполагая, что все ваши MDIChild являются экземплярами одного и того же класса, необходимо создать статическое (совместно используемое) свойство в вашем дочернем cl жопа:
Public Class [YourMDIChildClassName]
' ...
Private Shared _CurrentMDIChild As [YourMDIChildClassName] = Nothing
Public Shared ReadOnly Property CurrentMDIChild() As [YourMDIChildClassName]
Get
Return _CurrentMDIChild
End Get
End Property
' ...
End Class
И, используя ту же самую вещь, которую вы пытались, но с использованием .Activated вместо .Clicked
Public Class [YourMDIChildClassName]
' ...
Private Sub MyChildForm_Activated() Handles Me.Activated
_CurrenMDIChild = Me
End Sub
' And that's ALL this method SHOULD contain.
' If you try to add other activation tricks, like activating another Form,
' or firing up a DialogBox (worst case),
' everything will go WRONG and your application will hang in an endless loop !!!
' Be carefull when using .Activated.
' ...
End Class
Тогда вы могли бы получить доступ к текущей активной MDIChild с использованием статического свойства:
[YourMDIChildClassName].CurrentMDIChild
' => Gives you directly a VALID instance of your MDI Child (or Nothing !)
' Then you can use in your MDI Parent :
If [YourMDIChildClassName].CurrentMDIChild IsNot Nothing Then
Dim TextToSave As String = [YourMDIChildClassName].CurrentMDIChild.ContentToSave
' ... save your text...
End If
HOWEVER, потому что вы создали статический (общий) указатель на последний активный MDIChild (вид , Я знаю, что это не указатель, как в C)вы должны обновить этот указатель всякий раз, когда вы закрываете форму MDIChild!
Public Class [YourMDIChildClassName]
' ...
Private Sub [YourMDIChildClassName]_FormClosing(_
sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If _CurrentMDIChild Is Me Then ' And "Me" is closing right now...
_CurrentMDIChild = Nothing
' We don't want memory leak or pointer to a Form that has been closed !
End If
End Sub
' ...
End Class
Мы не должны создавать пользовательский способ обработки активации Child Form. MDIParent.ActiveMDIChild
есть для этого.Однако, как только мы хотим получить доступ к extended/custom/specific Свойства дочерней формы, которая изначально не существует в System.Windows.Forms.Form
, нам необходимо нарисовать MDIParent.ActiveMDIChild
на реальный тип производного типа MDIChild. Это еще один способ сделать это, но это только я: мне не нравятся отливки. Всегда устанавливайте IDE для:
Option Explicit On
Option Strict On
Option Infer Off
Forms.Clicked
... делает это событие (Клики) действительно существует? Я знаю .Click
, но не «Щелкнут». Во всяком случае:
Public Class [YourMDIChildClassName]
' ...
Private Sub MyChildForm_Clicked() Handles Me.Click
' This part is executed when you click INSIDE the Form,
' at a location where there is NO Control.
' If you click on a control, like a Textbox, a Picturebox, a Panel, etc
' this block IS NOT EXECUTED as you've clicked on a control,
' not on the Form !
End Sub
' ...
End Class
, где находится кнопка сохранения? есть ли в каждой форме? – Plutonix