2017-10-28 127 views
-2

我有一個調用另一個表單來執行某個操作的表單,如果該操作完成,那麼將設​​置一個標記作爲父級表單中的參數在兒童形式中爲真,但如果動作未完成,則該標誌保持假。在方法中設置爲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 
} 

在子窗體的代碼形式也是如此,但是在子表單關閉並編程回執行父表單代碼之後,該標誌變回爲假。

發生了什麼事?

+0

在這種codesample是不可能的,如果(標誌)進入 – BennoDual

+0

@BennoDual怎麼樣?子窗體中的方法將標誌設置爲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

你可以做到這一點上是這樣的:

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

正如我所說,調試表明,父母的標誌是真實的,這就是爲什麼我不明白。這工作,謝謝 –

相關問題