2014-10-07 4 views
0

선택한 양식의 텍스트 상자에서 일부 텍스트를 가져 오는 것이 궁금합니다. X 형식의 자식 폼을 포함하는 MDI 폼이 있습니다. 각 하위 폼에는 텍스트가 포함 된 텍스트 상자가 있습니다. 저장 버튼을 눌렀을 때 어떤 양식이 선택되었는지 어떻게 알 수 있나요? 어떻게 그 텍스트 상자에서 텍스트를 가져 옵니까?VB에서 선택한 양식의 텍스트를 가져옵니다.

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

양식을 클릭했을 때이를 감지하여 양식/양식 ID를 전역 변수에 저장하는 이벤트를 만들려고했습니다. 이견있는 사람?

+0

저장 버튼은 어디에 있습니까? 각 양식에 하나 있습니까? – Plutonix

답변

0

bodjo처럼 [YourMDIForm] .ActiveMDIChild 속성이 있습니다.

Plutonix가 말한 것처럼 명확하지 않은 점은 저장 버튼이 어디에 있는지입니다. 당신은 의미 했습니까 :

  • Save MenuItem from your MDI Parent Form?

  • 또는합니다 (MDI의 상위/하위 시스템의 일부가 아닌 또는 다른 양식 중 하나)를 MDI 자식 폼 내부 저장 버튼

첫 번째 경우는 매우 간단합니다 :의 .ActiveMDIChild를 사용하여 MDIParent Form.
secund은 ... 그것을 할 수있는 더 나은 방법이 당신이 당신의 globalVar과 노력 비슷한 실제 활성 자식 폼 (를 가리 키도록 몇 가지 유효한 방법이 필요 할 수 있습니다.

을 그건 그렇고, 당신이 얻을 때 . .ActiveMDIChild 통해 대상 MDIChild, 당신은 공중, 친구 또는 보호 변수 일반적 형태의 컨트롤이 비공개로 텍스트 상자에 액세스해야 당신이있을 수 있습니다 그래서 :.

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 

마지막 활성 MDIChild에 대한 정적 (공유) 포인터를 만들었으므로 (일종의 , 나는 C와 같은 포인터가 아닙니다.)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 

어린이 양식 활성화를 처리하는 사용자 지정 방법을 만들지 않아야합니다. MDIParent.ActiveMDIChild이 거기에 있습니다.그러나 일단 확장/사용자 지정/특정System.Windows.Forms.Form에 처음에는 존재하지 않는 하위 폼의 속성에 액세스하려는 경우 MDIParent.ActiveMDIChild을 실제 MDIChild에서 파생 된 형식으로 캐스팅해야합니다. 그것은 그것을 할 수있는 또 다른 방법이지만, 나만의 것입니다. 나는 주물을별로 좋아하지 않습니다.



Forms.Clicked ...

Option Explicit On 
Option Strict On 
Option Infer Off 
이 이벤트 (클릭 수)가 실제로 존재 않습니다 항상로 IDE 설정? 나는 .Click을 알고 있지만 "Clicked"는 아닙니다. 어쨌든 :

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

관련 문제