2017-05-08 22 views
0

我正在開發需要loggging應用C#DialogResult的習慣密切形式

我已經開發了以下幾種形式: - frmMain - 自舉窗口時frmLogon

形式主要發佈窗體應用程序。在主窗體的「顯示」事件中,FrmLogon窗體顯示爲對話框。

但是,當自動將DialogResult設置爲OK時,表單不會關閉,程序僅在手動點擊「登錄」按鈕時起作用,這會觸發完全相同的功能。

我試圖關閉()表單登錄,但這留給我一個System.ObjectDisposedException。

有什麼建議嗎?

FrmMain.CS

private void OnFormShown(object sender, EventArgs e) 
    { 
     OnClickMenuLogon(sender, e); 
    } 

private void OnClickMenuLogon(object sender, EventArgs e) 
     { 
      if (IsLoggedOn()) 
      { 
       G.LogOff(); 
       User = null; 
       OnLoggedOff(); 
      } 
      else 
      { 
       FrmLogon logon = new FrmLogon(G, true); 
       DialogResult result = logon.ShowDialog(); 
       if (result == DialogResult.OK) 
       { 
        User = logon.User; 
        _hostName = User.Name + " @ " + (String.IsNullOrEmpty(logon.HostName) ? Environment.MachineName : logon.HostName); 
        OnLoggedOn(); 
       } 
      } 
     } 

FrmLogon.CS

private void OnLogOnSuccess(object sender, LoggedOnEventArgs e) 
    { 
     tbStatus.Text = $"[{DateTime.Now.ToString("HH:mm:ss")}]: Successfully logged on.\r\n" + tbStatus.Text; 
     User = _g.LoggedUser; 
     HostName = tbHost.Text; 
     DialogResult = DialogResult.OK; 
    } 

編輯:當使用

this.DialogResult = DialogResult.OK; 
this.Close(); 

發生以下情況例外: Exception screenshot

+0

而不是DialogResult = DialogResult.OK;嘗試this.Close(); –

+0

@StephenWilson根據[正確使用DialogResult]不正確(http://stackoverflow.com/questions/16846573/using-dialogresult-correctly) – stuartd

+0

@StephenWilson this.Close將返回他DialogResult.Cancel –

回答

0

問題解決了,企圖在FrmLogon的構造函數中進行登錄,導致在初始化窗體之前設置DialogResult。在執行「Shown」事件並從FrmLogon調用該功能後,問題就解決了。謝謝你們。

0

而不是僅僅使用

DialogResult = DialogResult.OK; 

使用

this.DialogResult = DialogResult.OK; 
this.Close(); 

this.Close()將關閉你的第二個形式,並返回它的當前DialogResult

更新1

另一種是一些無形的按鈕添加到對話的形式,將其設置爲的AcceptButton並進行點擊它以這樣的方式

Button bt = new Button(); 
    bt.Click += new EventHandler((sender1,e1)=> { 
     this.DialogResult = DialogResult.OK; 
    }); 
    bt.FlatStyle = FlatStyle.Flat; 
    bt.FlatAppearance.BorderColor = BackColor; 
    bt.FlatAppearance.MouseOverBackColor = BackColor; 
    bt.FlatAppearance.MouseDownBackColor = BackColor; 
    this.Controls.Add(bt); 
    this.AcceptButton = bt; 
    bt.PerformClick(); 
+0

它不應該是必須的,問題的關鍵點 - 正如文檔所說的「如果窗體顯示爲對話框,則使用DialogResult枚舉中的值設置此屬性將設置對話框結果的值對於窗體,隱藏模式對話框,並將控制權返回給調用窗體。「_ – stuartd

+0

@stuartd是這樣,以防萬一您設置了AcceptButton和CancelButton,如MSDN示例中所示https://msdn.microsoft .com/en-us/library/system.windows.forms.form.dialogresult(v = vs.110).aspx –

+0

我已經試過了,這留下了以下異常:「System.ObjectDisposedException:'無法訪問刪除的對象。'「,刪除的對象是FrmLogon登錄對象。 –