2014-10-07 1 views
0

Мне было интересно, как вы могли бы взять некоторый текст из текстового поля в выбранной форме. У меня есть форма MDI, которая содержит X число дочерних форм. Каждая дочерняя форма содержит текстовое поле с некоторым текстом. Когда я нажимаю кнопку «Сохранить», как узнать, какая форма выбрана, и как мне получить текст из этого текстового поля.VB grab текст из выбранной формы

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

Я думал, чтобы сделать событие, которое просто определяет, когда-либо форма щелкают и сохранить это форма/форма ID в глобальной переменной. Есть предположения?

+0

, где находится кнопка сохранения? есть ли в каждой форме? – Plutonix

ответ

0

Как и Бодхо, у вас есть свойство [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 
+0

Спасибо. Да сохранить в моей родительской полосе меню MDI. Ваш ответ должен работать. Я попробую. Благодарю. – MooingRawr

1

Сначала вы должны указать determine the active child from, и вы можете проверить, в каком текстовом поле вы хотите прочитать его содержимое.

+0

Спасибо, что помогли. – MooingRawr