2015-08-25 41 views
0

今天,我使用了很多這些功能,但我已經發現了幾個關於它們的問題。 我的程序是這樣的結構:C# - this.Show(),關閉()和隱藏()不工作或崩潰

這是形式1

public partial class Form1 : Form 
{ 
public Form1() 
    { 
     InitializeComponent(); 
     ... 
     ... 
     edit = new Button(); 
     edit.Click += new EventHandler((s, e) => edit_mode(s, e,x,y,c,z)); //x, y, c, z are some variables that I need to pass to purposes of this software. 
     this.Controls.Add(edit); 
    } 
void edit_mode(object sender, EventArgs e, string x,string y, int c, int z) 
    { 
     ... 
     ... 
     Form edits = new Form4(); 
     edits.Show(); 
     this.Hide(); 
    } 
} 

,這是表格4

public partial class Form4 : Form 
{ 
    public Form4() 
    { 
     InitializeComponent(); 
     ... 
     ... 
     ... 
     Form backs= new Form1(); 
     backs.Show(); 
     this.Close(); 

    } 

此片的目標是如下:當我輸入「edit_mode」函數,Form1必須消失才能顯示一個新的Form(Form4)。

我在這裏搜索了很多,但沒有解決方案爲我工作:編譯器不報告我的錯誤,所以當我調試這段代碼似乎工作;但是當它到達edits.Show(); (在Form1中)它說:ObjectDisposedException錯誤,我不明白爲什麼。 我試圖用this.Hide()取代this.Close(),程序運行良好,直到執行Form4的this.Hide()函數: 實際上,當Form4出現並執行其代碼時,它會停止本身this.hide()和form4不會消失(同時出現Form1)。 我也試過在form4中創建一個按鈕,並在這裏移動代碼來打開Form1 ..它的工作原理非常棒!但我只有一個問題:我不希望用戶按下按鈕來使其工作。 所以我需要自動執行這個「表單更改」。

有關這個問題的任何想法?

+0

爲什麼你需要創建並顯示一個窗體(Form4),然後試圖關閉它的構造函數? ....中的代碼不能被Form1直接調用的類方法替換? – Steve

+0

除了史蒂夫所說的......你正在創建一個Form1的新實例。如果要顯示已經初始化的Form1,則必須在顯示Form4之前添加Owner屬性:edits.Owner = this;然後從Form4中顯示出來你做這個.Owner.Show(); –

+0

如果您嘗試在處置對象中執行某些操作,則會發生ObjectDisposedException。調用Close方法後,您不能調用Show方法,因爲表單的資源已經被處置。而你爲什麼試圖關閉窗體構造函數中的窗體? – ssakash

回答

2

不知道你正在試圖放置在Form4的構造函數的....點要達到什麼,但是可以肯定,要求隨意炸燬edits.ShowForm edits = new Form4();
事實上後調用構造函數的末尾關閉,那時,edits變量指向Form4的一個實例,它不再可用(處置)。

你可以嘗試這些變化

void edit_mode(object sender, EventArgs e, string x,string y, int c, int z) 
{ 
    ... 
    ... 
    this.Hide(); 
    Form edits = new Form4(); 
    edits.ShowDialog(); 
    this.Show(); 
} 


public partial class Form4 : Form 
{ 
    public Form4() 
    { 
     InitializeComponent(); 
     this.Shown += Form4_Shown; 
     // These lines doesn't make sense because you are creating a 
     // different instance of Form1. This instance (named backs) is 
     // not the same instance that creates the Form4 
     // Form backs= new Form1(); 
     // backs.Show(); 

     // Moved to the Form4_Shown event handler 
     // this.Close(); 

    } 
    public void Form4_Shown(object sender, EventArgs e) 
    { 
     // Move here the code that was previously in the constructor 
     .... 
     .... 
     this.Close(); 
    } 

解決您的代碼這種方式移動自己與Form4的構造函數中顯示的事件點來代替代碼。當顯示錶單並且所有控件已經初始化時,此事件觸發。那時你可以決定關閉實例。

仍然令人費解的是,爲什麼你需要顯示一個表格然後立即關閉它。如果您不需要與用戶進行任何交互,則可以選擇在類中移動虛線代碼,並且不會嘗試顯示Form4。

+1

這仍然有相同的老問題,表單在創建完成之前被銷燬,所以'ShowDialog()'將失敗。 –

+0

@BenVoigt你是對的,需要在Shown事件中移動代碼 – Steve

+0

好吧,form1包含幾個使用mysql數據製作的標籤和按鈕。如果我想編輯並正確顯示這些數據,我需要刷新(或更好地重新啓動)所有應用程序。但問題是我不想關閉我的應用程序。因此,爲了重新啓動所有應用程序而不關閉它,我想使用Form4:它是一個加載表單。所以有一個叫做I的var從0增加到20並完成它,我記得form1使用backs.show ()並重新啓動。 – Ricks23