显示一个模态的Form暂时终止用户操作。

原创 2006年05月23日 10:54:00

显示一个模态的Form暂时终止用户操作。来源于csdn上的我的一个问题,没有一个解答的人能真正的解决问题。最后自己搞定了。
---------问题提出:-----------
比如我要进行文件拷贝操作,可能比较费时。我希望出现一个Form,显示“正在拷贝文件...”,这个Form是模态的,也就是在拷贝文件的时候用户不能够进行其他操作。拷贝完成后,把该Form关闭。然后用户可以进行其他操作,比如点击菜单等等。

原文连接:http://community.csdn.net/Expert/TopicView.asp?id=4753165

下面的回答要不问不对题,要不想当然。还是要自己实践:

主要的思路是让模态窗口来执行后台操作,执行完毕后给主窗口发送一个消息。
这里Form1是主窗口,点击button1后,开始显示一个模态窗口form2“正在拷贝中。。。”用(sleep来模拟),拷贝完成后,给form1发送一个消息,Form1收到后,把Form2 close就行了。

//----------form1.cs-----------------
public partial class Form1 : Form
    {
        Form2 fm;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            fm = new Form2();
            fm.TaskFinished += new IClosed(fm_TaskFinished);
            fm.ShowDialog();
        }

        void fm_TaskFinished()
        {
            fm.Close();
        }
    }

//------form2.cs----------
 public delegate void IClosed();

    public partial class Form2 : Form
    {
        public event IClosed TaskFinished;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
//这里必须要用一个线程,并且调用Application.DoEvents();要不然Form2显示有问题。
            Thread m_workthread = new Thread(new ThreadStart(customdoing));
            m_workthread.Start();
            Application.DoEvents();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            TaskFinished();
        }

        private void customdoing()
        {
            Thread.Sleep(5000);
            this.Text = "Thread finished";
            TaskFinished();
        }
    }

!--------可以改进的空间-----------
其实最好的是这个customdoing中执行的操作由Form1传递进来就好了。不过我懒得想了。
也有替代的方法,比如设置一个int eventtype,Form1传递1,2,3,4。。。然后在Form2中定义需要的所有操作,根据eventtype来调用相关的函数。

Form2.cs中button1_Click可以改造一下,写成“取消”,也就是取消当前的拷贝。
那么就应该是这样了:
private void button1_Click(object sender, EventArgs e)
        {
//当然,这时的m_workthread应该定义成Form2的成员变量了。而不是 Form2_Load中的局部变量
m_workthread.abort();
m_workthread.jion();
            TaskFinished();
        }

系统暂时未支持离开用户的补分操作处理

分不能成整数所有报错 源码位置:系统模块\服务器组件\游戏服务器\TableFrame.cpp    第653行左右 感谢网友:899回答...
  • piazini
  • piazini
  • 2013年12月02日 17:19
  • 2636

模态窗口提交form打开新窗口的解决办法

模态窗口提交form打开新窗口的解决办法
  • samxx8
  • samxx8
  • 2011年03月17日 13:15
  • 3684

C# WinForm 模态对话框与非模态对话框的区别

【1】如果是模态的,那么弹出后该程序的其它窗口就呈不可用的状态,原来程序暂停执行,直到这个模态窗口关闭后才回到原来程序继续。 【2】非模态的就是直接显示出来,然后原来的程序继续执行下面的语句,而且其它...
  • u010276845
  • u010276845
  • 2013年11月06日 22:52
  • 3774

su切换到用户user1报无法设置用户ID:资源暂时不可用错误

操作系统:rhel 6  centos6上也存在这样的问题 su切换到用户user1报无法设置用户ID:资源暂时不可用错误 问题是出在:在/etc/security/limits.d目录下...
  • devin223
  • devin223
  • 2015年05月26日 13:39
  • 2705

CentOS 6/Linux su: 无法设置用户ID: 资源暂时不可用

今天在使用su切换用户doiido的的时候,出现了如下报错:su: 无法设置用户ID: 资源暂时不可用 同时使用SecureCRT等远程SSH工具均无法使用doiido用户连接。查找相关资料,发现是在...
  • doiido
  • doiido
  • 2015年02月06日 22:05
  • 2968

C#在一个form中改变另一个form中控件的内容、C#做登录界面并且密码显示为*

C#中在一个窗体中改变另外一个窗体中控件的显示 这个问题可以用来改变messageBox中默认显示的“确定”,可以使用此方法重新写一个窗体,显示OK; 方法: 1、将要改变的form中的控件属性改...
  • yanhuatangtang
  • yanhuatangtang
  • 2017年08月31日 09:58
  • 397

【ExtJs】模态确定框与模态输入框

确定框与模态输入框在VC6的MFC窗体程序是不可或缺地东西,还记得在VC6的MFC搞一个模态输入框是多么蛋疼的一件事,详见《【mfc】用对话框的切换实现重新登录》(点击打开链接),但是搬到网页上,用E...
  • yongh701
  • yongh701
  • 2015年04月23日 09:02
  • 1883

Qt 界面的模态与非模态设置

1、对QWidget设置模态窗口有两种方法: 第一种是在构造函数中        setWindowFlags(Qt::FramelessWindowHint);        setAttri...
  • iamplane
  • iamplane
  • 2017年07月25日 19:04
  • 386

su: 无法设置用户ID: 资源暂时不可用

用 ssh 命令连接服务器之后,如果一段时间不操作,再次进入 Terminal 时会有一段时间没有响应,然后就出现错误提示: Write failed: Broken pipe ...
  • Alvin_Lam
  • Alvin_Lam
  • 2016年06月02日 14:56
  • 4274

JS模拟form表单提交,浏览器终止提交

1、js模拟form表单提交,如下实例       var  form = $("");       form.attr("action", "http://...");       ........
  • angry_tiger
  • angry_tiger
  • 2017年03月01日 15:21
  • 513
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:显示一个模态的Form暂时终止用户操作。
举报原因:
原因补充:

(最多只允许输入30个字)