MooingRawr
MooingRawr

Reputation: 4991

VB grab text from selected form

I was wondering how you would grab some text from a textbox in a selected form. I have a MDI form which contains X number of child forms. Each child form has a textbox in it with some text. When I hit the save button how do I know which form is selected and how do I grab the text from that textbox.

Private Sub Forms_Clicked(sender As Object, e As EventArgs) Handles Forms.clicked
    globalVar = sender
End Sub

I was thinking to make an event that just detects when ever a form is clicked and save it's form/form ID in a global variable. Any thoughts?

Upvotes: 0

Views: 367

Answers (2)

Karl Stephen
Karl Stephen

Reputation: 1140

Like bodjo said, you have the [YourMDIForm].ActiveMDIChild property.

What is unclear, like Plutonix said is where is your Save "Button". Did you meant :

  • a Save MenuItem from a MenuStrip on your MDI Parent Form ?

  • or a Save Button inside an MDI Child Form (or either another Form that is not part of the MDI Parent/Child system)

The first case is pretty straightforward : Use the .ActiveMDIChild of your MDIParent Form.
The secund may need some valid way to point to an actual active child form (similar to the one you tried with your globalVar... there are better ways to do it.

By the way, when you get your targeted MDIChild through .ActiveMDIChild, you must access the textbox with a Public, Friend or Protected variable. Usually, controls in forms are private. So you may have to :

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

Another way to access the "active" MDIChild, assuming all of your MDIChild are instances of the same class is to create a static (shared) property in your Child class :

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

And using the same thing you tried, but using .Activated instead of .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

Then you could access the currently active MDIChild using the static Property :

[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, because you've created a static (shared) pointer to the last active MDIChild (sort of, I know it's not a pointer like in C) you must update this pointer whenever you close an MDIChild Form !

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

We are not supposed to create custom way of handling Child Form activation. MDIParent.ActiveMDIChild is there for that. However, once we want to access extended/custom/specific Properties of the Child Form that doesn't initially exists in System.Windows.Forms.Form, we need to cast the MDIParent.ActiveMDIChild to the real Form derived Type of our MDIChild. That's one other way to do it, but it's just me : I don't like castings much. Always set IDE to :

Option Explicit On
Option Strict On
Option Infer Off



Forms.Clicked ... does this event (Clicked) really exist ? I'm aware of .Click but not "Clicked". Anyway :

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

Upvotes: 0

bodjo
bodjo

Reputation: 326

You have to determine the active child from first and from there, you can check which text box you want to read its content.

Upvotes: 1

Related Questions