2012-12-07 11 views
1

"Order"라는 자식 폼을 열 수있는 MDI 부모 폼이 있습니다. 주문 양식에는 사용자가 주문을 인쇄 할 수있는 버튼이 있습니다.VB.NET의 MDI 부모 폼에서 자식 폼의 공용 변수를 조정하십시오.

Public Class Order 

Public psize As String 

    Private Sub button_order_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles process_order.Click 
    ' Code to handle the order and then print, etc 

지금 부모 폼이뿐만 아니라 psize 변수를 가지고, "A4"의 기본값으로 설정되어 주문 양식은 처음에 정의 된 인쇄 크기 변수가 있습니다. 누군가가 클릭 할 때 만 부모 윈도우의 메뉴 모음에서 메뉴 항목 중 하나는이 상황이 발생합니다 기본적으로

psize = "A6" 

, 부모 윈도우가 새로운 주문 양식을 열 때마다, 나는 그것을 설정해야 자식 폼의 psize은 자체 값인 psize 값으로 변합니다. 다음과 같은 내용 :

Dim f As Form 
    f = New Order 
    f.MdiParent = Me 
    f.psize = Me.psize ' BUT THIS LINE DOESN'T WORK 
    f.Show() 

f.psize가 양식의 구성원이 아닙니다. MDI 부모와 자식간에 변수를 전달하는 것은 매우 일반적입니다.하지만 여기에서 보았던 몇 가지 옵션을 시도해 보았지만 작동하지 않는 것 같습니다. 이것은 잘못된 접근입니까?

+1

어떤 식으로 작동하지 않는 형태의 실제 구현에

Dim f As Form 

? –

+0

"f"를 입력하면 "psize"를 선택하고 f.psize를 입력 할 수있는 옵션에 나타나야한다고 생각합니다.하지만 "psize가 System의 멤버가 아닙니다 ..."라는 오류가 발생합니다. Windows.Forms ". Order.psize라고하면 작동합니다. 그러나이 현재 인스턴스에서 값을 어떻게 할당 할 수 있습니까? – user961627

답변

2

변수를 사용할 수없는 이유는 변수에 잘못된 유형을 사용하고 있기 때문입니다. 기본 Form 유형은 해당 속성을 정의하지 않습니다. 오히려 파생 된 Order 유형이 있습니다. 이 같은 것을 할 수있는 :

Dim f As Order 
f = New Order 
f.MdiParent = Me 
f.psize = Me.psize 
f.Show() 

UPDATE를 아래 의견에 말했듯이, 당신이 정말해야 할 것은 그래서 모든 형태의 사이에 동적 설정을 공유 할 수있다

언제든지 설정을 변경하고 이미 표시된 모든 양식에 영향을 주도록 할 수 있습니다. 그렇게 할 수있는 가장 좋은 방법은, 예를 들어, 모든 공유 설정을 저장하는 새로운 클래스를 생성하는 것입니다 : 당신이 볼 수 있듯이에서, 그렇게함으로써, 당신은 쉽게 모든 기본 설정을 중앙 집중화 할 수

Public Class Settings 
    Public PaperSize As String = "A6" 
End Class 

당신의 설정 클래스를 추가하는 것이 좋습니다.

Public Class Order 
    Inherits Form 

    Public Settings As Settings 
End Class 

그런 다음, 당신이 당신의 공유 설정을 만들 필요가 귀하의 MDI 부모 폼에 반대하고 그것을 전달할 : 다음, 당신은 예를 들어, 새로운 Settings 유형에 Order 형태로 공공 재산을 변경해야 부모 폼 때문에,

Pubic Class MyParentForm 
    Private _settings As New Settings() 

    Private Sub ShowNewOrderForm() 
     Dim f As New Order() 
     f.MdiParent = Me 
     f.Settings = _settings 
     f.Show() 
    End Sub 

    Private Sub ChangePaperSize(size As String) 
     _settings.PaperSize = size 
    End Sub 
End Class 

그리고 모든 아이 Order 양식은 같은 Settings 객체를 공유하고, 그 Settings 개체를 만든 변화는 모두 즉시 보일 것이다 : 당신의 Order 형태의 각 그들이 만들어으로 양식.

+0

나는 이것을 시도했다, 그것은 어떤 오류도 보여주지 않기 때문에 매끄럽게가는 것처럼 보인다. Order 폼의 load 이벤트에 msgbox를 붙여 현재 psize를 표시합니다. 시작하면 예상대로 A4가 표시됩니다. 그러나 실제로 MDI 부모의 psize를 변경 한 다음 새 Order 양식을로드하면 psize에 아무런 가치가 없습니다. A4 나 A6도 공백이 아닙니다! 이것은 실제로 부모의 psize를 변경하는 데 사용하는 코드입니다.'Me.psize = "A6"'... 아주 간단하지만 작동하지 않습니다! – user961627

+1

주문 양식이 이미 표시된 후에 변경 하시겠습니까? –

+0

그래도 작동하지만 예, 현재 열려있는 주문 양식에 문제가 있습니다 ... 다음을 시도했지만 f.psize가 오류를 발생시킵니다. 'For Each f In Me.MdiChildren TypeOf (f)가 ​​주문일 경우 f.psize = Me.psize 끝 부분 다음 ' 어떻게 변수 f를 "주문"유형으로 동적으로 다시 할당 할 수 있습니까? – user961627

2

변경이 :

Dim f As Order 

하거나 바로 가기 :

Dim f As New Order