2009-07-21 37 views
1

我試圖搜索這個,但我不確定如何描述它。如果它是重複的,請告訴我另一個問題。謝謝。C#窗體 - 對話框窗體在下一個動作前僅部分消失

我使用VS 2008創建了一個C#Windows窗體應用程序。從主窗體中打開一個自定義對話框窗體。當用戶關閉對話框表單時,它在應用程序啓動到下一個任務之前不會完全消失。表格各個部分的大綱一直保留到完成一些額外的任務。

這看起來很不專業,它使應用程序看起來被打破,即使一切都很好。有什麼辦法可以避免和/或解決這個問題嗎?

僅供參考,額外的任務是在表格關閉後要求的計算。

下面是表格結束代碼。

private void CloseForm_Click(object sender, EventArgs e) 
{ 
    Properties.Settings.Default.EndDate = cmbBoxRptDate.SelectedValue.ToString(); 
    rptDate = cmbBoxRptDate.SelectedValue.ToString(); 
    Var1 = cmbBoxVar1.SelectedValue.ToString(); 
    Var2 = cmbBoxVar2.SelectedValue.ToString(); 
    this.Close(); 
} 

以下是打開自定義模式對話框然後在關閉後將其處置掉的主窗體中的代碼。我認爲這種處置可能是多餘的,因爲表單自己會調用close方法。

RptSettingsForm RS = new RptSettingsForm(); 
DialogResult DR = RS.ShowDialog(); 
String var1 = RS.getVar1().ToString(); 
String var2 = RS.getVar2().ToString(); 
String rptDate = RS.getDate().ToString(); 
RS.Dispose(); 

然後建立一個連接到SQL Server做一些報告計算。

回答

1

你可以做的是強制調用形式重繪自己關閉對話框,用其他的東西在繼續前經過:

RptSettingsForm RS = new RptSettingsForm(); 
DialogResult DR = RS.ShowDialog(); 
this.Refresh(); // force repaint 
String var1 = RS.getVar1().ToString(); 
String var2 = RS.getVar2().ToString(); 
String rptDate = RS.getDate().ToString(); 
RS.Dispose(); 

注意,有兩種方法,將導致一種形式(或控制)重新繪製自己:InvalidateRefreshRefresh將立即強制重新繪製。 Invalidate不會導致立即重繪,而是使完全控制表面無效,以便在下次控制更新時整個表面將重新繪製(如果線程忙於其他東西,可能會稍微延遲一點,如在您的情況中)。

要調用Invalidate後強制重繪,您可以調用Update方法,該方法將強制立即重新繪製失效區域。因此,對於您的情況,您可能只需撥打Update而不是Refresh,因爲我猜想以前由對話框覆蓋的區域應該失效。這可能會更有效地強制進行全面重繪:

RptSettingsForm RS = new RptSettingsForm(); 
DialogResult DR = RS.ShowDialog(); 
this.Update(); // force repaint of invalidated areas 
String var1 = RS.getVar1().ToString(); 
String var2 = RS.getVar2().ToString(); 
String rptDate = RS.getDate().ToString(); 
RS.Dispose(); 
+0

感謝您的幫助。這絕對解決了這個問題。 – 2009-07-21 06:33:09

+0

很高興幫助。這就是說;你應該真的看看喬恩的建議,這是值得期待的。 – 2009-07-21 06:35:20

0

看起來您的主窗體沒有被刷新。你可以嘗試調用this.Refresh()後showdialog?

2

我懷疑最後一點是最重要的:

然後建立一個連接到SQL Server做一些報表計算。

這仍然是在UI線程?如果是這樣,那可能是問題 - 主窗口的重新繪製事件可能還在等待發生,但是你忙於數據庫。

弗雷德裏克建議調用Refresh是一個不錯的選擇,但你基本上已經在UI線程上做了太多的問題。如果無論出於何種原因需要很長時間才能建立與SQL Server的連接,則在此期間您的用戶界面將被凍結 - 您將無法移動它,調整其大小等。

長時間運行 - 包括幾乎所有與數據庫有關的事情都應該在不同的線程上完成。毫無疑問,這確實使事情變得更加棘手,但最終還是提供了更好的UI。

相關問題