Messagebox隐藏

zengtiantian112 2020-07-12 07:09:33
写了个上位机,在form1里开了个线程,在另一个FUN.cs里调用一个函数,该函数处理了一个Excel文件,然后保存并弹出对话框提示文件保存成功,MessageBox.Show("Save Data Success!");
但是这个对话框从来不出现在最上面,要自己到任务栏去找出来点“OK”才能消除。
请各位大神帮忙看看怎么样让这个对话框出现在主窗体之前呢?
...全文
2067 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2020-07-13
  • 打赏
  • 举报
回复
自定义弹出层,定时关闭?
datafansbj 2020-07-13
  • 打赏
  • 举报
回复
你需要修改那个 FUN.cs 里的函数,即修改 MessageBox 调用时指定的句柄(Handle),这个问题从外部难以处理。总体来说那个 FUNC.cs 设计的比较糟糕,一个底层函数不应弹出 MessageBox 之类的对话框或界面窗体,尤其是可以多线程操作的函数。如果必须弹出,那么该函数应带有一个参数 handle,表示调用者的句柄。
Bridge_go 2020-07-13
  • 打赏
  • 举报
回复
引用 2 楼 zengtiantian112 的回复:
[quote=引用 1 楼 以专业开发人员为伍 的回复:]
yourForm.BeginInvoke((Action)delegate
{
........保存
}
如果希望阻塞线程,把 BeginInvoke 改为 Invoke。
不好意思,这段代码是放在form1.cs里吗,我是准备在func.cs里调用,好像调用不了form1.begininvoke[/quote] 那就再搞个事件
luj_1768 2020-07-13
  • 打赏
  • 举报
回复
messageBox 是个阻断式例程,会阻断进程中其他操作,必须待其受理完成后、进程才能继续进行其他操作。因此,如果只是提示一个信息,建议使用其他方式(比如,使用信息栏或者对话框)。
  • 打赏
  • 举报
回复
例如
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 直接引用窗体了。
  • 打赏
  • 举报
回复
引用 2 楼 zengtiantian112 的回复:
[quote=引用 1 楼 以专业开发人员为伍 的回复:]
yourForm.BeginInvoke((Action)delegate
{
........保存
}


如果希望阻塞线程,把 BeginInvoke 改为 Invoke。
不好意思,这段代码是放在form1.cs里吗,我是准备在func.cs里调用,好像调用不了form1.begininvoke[/quote]

form1 可以作为引用窗体实例的参数将窗体传入你的处理方法,也可以定义一个全局(static)引用。

实际上我并不确定 MessageBox 会不会被“隐藏”,你只是试试的话,那么用一个 static 的变量引用你的 Application 的主窗口,或者甚至是从 Application.OpenForms 中取第一个都行,这里只是试一下看看能不能让 UI 主线程被阻塞一下。
z467057213c 2020-07-13
  • 打赏
  • 举报
回复
指定MessageBox的owner即可实现顶层弹窗,MessageBox本身是支持后台弹窗和前台弹窗 或者直接调用SetForeground
zengtiantian112 2020-07-12
  • 打赏
  • 举报
回复
引用 1 楼 以专业开发人员为伍 的回复:
yourForm.BeginInvoke((Action)delegate
{
........保存
}


如果希望阻塞线程,把 BeginInvoke 改为 Invoke。
不好意思,这段代码是放在form1.cs里吗,我是准备在func.cs里调用,好像调用不了form1.begininvoke
  • 打赏
  • 举报
回复
yourForm.BeginInvoke((Action)delegate
{
........保存
}


如果希望阻塞线程,把 BeginInvoke 改为 Invoke。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧