寫了個上位機,在form1里開了個執行緒,在另一個FUN.cs里呼叫一個函式,該函式處理了一個Excel檔案,然后保存并彈出對話框提示檔案保存成功,MessageBox.Show("Save Data Success!");
但是這個對話框從來不出現在最上面,要自己到任務欄去找出來點“OK”才能消除。
請各位大神幫忙看看怎么樣讓這個對話框出現在主表單之前呢?
uj5u.com熱心網友回復:
yourForm.BeginInvoke((Action)delegate
{
........保存
}
如果希望阻塞執行緒,把 BeginInvoke 改為 Invoke。
uj5u.com熱心網友回復:
不好意思,這段代碼是放在form1.cs里嗎,我是準備在func.cs里呼叫,好像呼叫不了form1.begininvokeuj5u.com熱心網友回復:
messageBox 是個阻斷式例程,會阻斷行程中其他操作,必須待其受理完成后、行程才能繼續進行其他操作。因此,如果只是提示一個資訊,建議使用其他方式(比如,使用資訊欄或者對話框)。uj5u.com熱心網友回復:
那就再搞個事件
uj5u.com熱心網友回復:
你需要修改那個 FUN.cs 里的函式,即修改 MessageBox 呼叫時指定的句柄(Handle),這個問題從外部難以處理。總體來說那個 FUNC.cs 設計的比較糟糕,一個底層函式不應彈出 MessageBox 之類的對話框或界面表單,尤其是可以多執行緒操作的函式。如果必須彈出,那么該函式應帶有一個引數 handle,表示呼叫者的句柄。uj5u.com熱心網友回復:
自定義彈出層,定時關閉?uj5u.com熱心網友回復:
指定MessageBox的owner即可實作頂層彈窗,MessageBox本身是支持后臺彈窗和前臺彈窗或者直接呼叫SetForeground
uj5u.com熱心網友回復:
不好意思,這段代碼是放在form1.cs里嗎,我是準備在func.cs里呼叫,好像呼叫不了form1.begininvoke yourForm.BeginInvoke((Action)delegate
{
........保存
}
如果希望阻塞執行緒,把 BeginInvoke 改為 Invoke。
form1 可以作為參考表單實體的引數將表單傳入你的處理方法,也可以定義一個全域(static)參考。
實際上我并不確定 MessageBox 會不會被“隱藏”,你只是試試的話,那么用一個 static 的變數參考你的 Application 的主視窗,或者甚至是從 Application.OpenForms 中取第一個都行,這里只是試一下看看能不能讓 UI 主執行緒被阻塞一下。
uj5u.com熱心網友回復:
例如namespace WindowsFormsApp1
{
static class Program
{
/// <summary>
/// 應用程式的主入口點。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MyForm1 = new Form1();
Application.Run(MyForm1);
}
static public Form1 MyForm1;
}
}
這就可以在任何地方用 Class 直接參考表單了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/24514.html
標籤:C#
上一篇:VB.NET MD5值計算
