2017-10-28 17 views
-2

조치를 수행 할 다른 양식을 호출하는 양식이 있으며 해당 작업이 수행되면 상위 양식에 매개 변수로 넣은 플래그가 설정됩니다 자식 폼에서 true로 설정하지만 액션이 완료되지 않으면 플래그가 false로 유지됩니다.부울 매개 변수는 메서드에서 true로 설정된 후에 false를 반환합니다.

부모 폼의 코드 :

bool flag; 
public ChildForm(bool flag) 
{ 
InitializeComponent(); 
this.flag = flag; 
} 
private SomeMethod() 
{ 
//some code 
flag = true; 
this.Close(); 
} 

내가 플래그 다음에, 자식 폼에서 true로 부모의 플래그를 설정 것을보고 그것을 디버깅 :

bool flag = false; 
new ChildForm(flag).ShowDialog(); 
if(flag) 
{ 
//some code that depends on that flag be true 
} 

자식 폼의 코드 form이 또한 true이지만, 자식 폼이 닫히고 부모 폼 코드를 실행하기 위해 다시 프로그램 된 후, 플래그는 false가됩니다.

무슨 일입니까?

+0

하는 경우 (플래그) @BennoDual 어떻게 입력합니까 – BennoDual

+0

? 자식 폼의 메서드는 플래그를 true로 설정합니다. –

+0

ChildForm의 플래그를 true로 설정합니다. 이는 상위 폼의 변수에 영향을 미치지 않습니다. – BennoDual

답변

1

플래그 변수 ChildForm의 생성자 값으로 전달하며 플래그 불리는 전용 변수에 할당된다. 즉, 개인 변수에 대한 변경 사항은 원래 변수에 영향을주지 않습니다.

이 문제를 해결하려면 ChildForm 변수를 public으로 선언하고 원래 방법으로 사용해야합니다.

public boolean flag; 
public ChildForm(boolean flag) 
{ 
    InitializeComponent(); 
    this.flag = flag; 
} 
private SomeMethod() 
{ 
    //some code 
    flag = true; 
    this.Close(); 
} 

그리고

boolean flag = false; 
var form = new ChildForm(flag); 
form.ShowDialog(); 
if(form.flag) 
{ 
//some code that depends on that flag be true 
} 

값/참조 변수 전달에 대한 정보를 참조 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-value-type-parameters 다음 일본어 방법을 변경.

+0

내가 말했듯이, 디버그는 부모 플래그가 사실임을 보여 주었고, 이것이 내가 이해하지 못한 이유입니다. 내 문제를 해결했습니다. 덕분에 –

1

부모 형태로 true으로 변경되었다는 사실은 아마도 디버거에서 보는 것의 부작용 일 수 있습니다. 실제로는 변경되지 않습니다 true.

자식 폼의 값을 읽으려면 액세스 할 수 있도록 설정해야합니다.

부모 양식 :

var c = new ChildForm(); 
c.ShowDialog(); 
if (c.Flag) 
{ 
    //some code that depends on that flag be true 
} 

자식 폼 :이 방법에 그것을 할 수

public bool Flag { get; private set; } 
public ChildForm() 
{ 
    InitializeComponent(); 
} 
private SomeMethod() 
{ 
    //some code 
    Flag = true; 
    this.Close(); 
} 
+0

디버깅에서의 부작용이 저를 속였습니다. 감사합니다. –

1

: 그것은 불가능이 codesample에서

public class ChildForm { 
    public ChildForm(bool flag) { 
     InitializeComponent(); 
     this.Flag = flag; 
    } 

    private SomeMethod() { 
     //some code 
     this.Flag = true; 
     this.Close(); 
    } 
    public bool Flag {get;} 
} 

public class ParentForm { 
    public void Foo() { 
     bool flag = false; 
     var child = new ChildForm(flag); 
     child.ShowDialog(); 
     if(child.Flag) { 
      //some code that depends on that flag be true 
     } 
    } 
} 
+0

제가 말했듯이, 디버그는 부모 플래그가 사실임을 보여주었습니다. 이것이 내가 이해하지 못한 이유입니다. 이 덕분에, 고마워. –