c#中如何控制模态子窗体中的进度条

这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这两件事情都必须做,却都不能先做...

所以很多人不得不把事务处理写到模态窗体当中去,这样可以达到目的,却造成了代码结构混乱,而且子窗体无法复用,如果有多个事物,不得不为每个事务来写控制窗体。

这里我们介绍一种比较直接了当的方法,就是主线程中开启两个子线程,一个用于显示模态窗体,一个用于处理事务, 并同时更新第一个线程中的窗体信息。

这里的知识范畴会包含线程的基础用法,线程和UI之间的交互,以及委托的基本用法。如果你还不了解这几点,可以参考一些其他资料,比如我先前写过的,在同一窗体中用子线程来控制进度条

http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx

这里的应用稍微复杂一些,你可以先用Vs2005新建一个Windows Application,这个application包含两个窗体,一个Form1,为主窗体,一个Form2,为模态子窗体。Form1,中添加Button1,用来开启测试。Form2中添加进度条ProgressBar1和一个用来取消事务的按钮Button1。然后把如下代码贴入测试程序中的两个form里面。

Form1,主窗体

using System;
using System.Windows.Forms;

namespace WindowsApplication39
...{
  public partial class Form1 : Form
  ...{

    delegate void dShowForm();
    Form2 frm = new Form2();

    public Form1()
    ...{
      this.InitializeComponent();
    }
    //显示窗体
    void ShowForm()
    ...{
      if (this.InvokeRequired)
      ...{
        this.Invoke(new dShowForm(this.ShowForm));
      }
      else
      ...{
        frm.ShowDialog(this);
      }
    }
    //控制进度
    void SetProgress()
    ...{
      for (int i = 1; i <= 100; i++)
      ...{
        if (frm.DialogResult == DialogResult.Cancel)
        ...{
          //判断取消
          break;
        }
        else
        ...{
          //模拟进度
          frm.SetProgress(100, i);
          System.Threading.Thread.Sleep(50);
        }
      }
    }
    private void button1_Click(object sender, EventArgs e)
    ...{
      new System.Threading.Thread(new System.Threading.ThreadStart(ShowForm)).Start();
      new System.Threading.Thread(new System.Threading.ThreadStart(SetProgress)).Start();
    }
  }
}

时间: 2024-12-02 18:25:47

c#中如何控制模态子窗体中的进度条的相关文章

如何在MDI子窗体中使用TransparencyKey属性

问题描述 如何在MDI子窗体中使用TransparencyKey属性如果窗体不是MDI子窗体,则可以通过设置TransparencyKey属性使得窗体透明.但如果窗体时MDI子窗体,这个属性就无效了.请教有什么办法使得MDI子窗体透明或其TransparencyKey属性生效. 解决方案 解决方案二: 解决方案三:感觉是来踢馆的解决方案四:是不可以的,让MDI子窗体再穿透MDI主窗体实在有点为难windows了不知为何一定要MDI呢?解决方案五:引用3楼xuzuning的回复: 是不可以的,让M

如何在父窗体的ListView中获取子窗体中datagridview中的值

问题描述 如何在父窗体的ListView中获取子窗体中datagridview中的值?详细啊本人只是初学者 解决方案 解决方案二:datagridview弄成public

winform子窗体中的多线程怎么完全释放

问题描述 winform子窗体中的多线程怎么完全释放 我在主窗体中打开一个子窗口,然后这个子窗口中有三个多线程,当窗口关闭的时候,如何完全释放掉这三个多线程.要不然每次打开就会多三个线程,系统会越来越卡. 补充:我的三个线程里都是while(true){}无限循环 解决方案 线程执行完毕就会自行释放,你一定要让线程有退出的条件,比如置一个变量,在内部循环中判断,从而退出while等循环操作 解决方案二: 当然,有强制杀死进程的api方法,但是不提倡使用 解决方案三: 可以在窗口退出事件如OnFo

c#winfrom 如何在子窗体中获取 父窗体中的datagridview选中行的id?

问题描述 c#winfrom 如何在子窗体中获取 父窗体中的datagridview选中行的id? c#winfrom 如何在子窗体中获取 父窗体中的datagridview选中行的id? 解决方案 用this.dataGridView1.CurrentRow.Cells[0].Value获得id 窗体传值看我的代码http://bbs.csdn.net/topics/360140208 解决方案二: 用委托或事件传递也可以 解决方案三: 通过静态字段传过去,在父窗体的选中事件下获取选中行的id

在MDI的子窗体中,KeyDown和MouseWheel就无法响应了

问题描述 在MDI的子窗体中,定义了KeyDown.MouseWheel.MouseMove.MouseDown等事件,触发MosueMove事件后,KeyDown和MouseWheel就无法响应了.请问是什么原因?谢谢! 解决方案 解决方案二:在子窗体的MouseDown中加入boolbolFocus=this.MdiParentForm.Focus();得到bolFocus为false,父窗体获取焦点失败.在父窗体中定义子窗体映像frmChildForm,在出现这种情况后运行boolbolF

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)

本文转载:http://www.csframework.com/archive/2/arc-2-20110805-1771.htm 文章侧重点主要是讨论"窗体"与"窗体"之间方法的调用,以及"MDI父窗体"与"Chilid子窗体"之间如何相互的调用方法. C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) 看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写: C# Code: //父窗体是是frmPare

delphi 中fastreport 如何像在窗体中一样 使用adoquery

问题描述 本人新手,对于fastreport控件知之甚少,想了解下delphi中fastreport如何像在窗体中一样动态的使用adoquery,能够给fastreport中的报表控件赋值 解决方案 解决方案二:报表里也有ADO,本来就是和程序一样使用的.解决方案三:看了fastreport自带的demo->main才知道这些,继续学习....解决方案四:demo的确重要,我用finereport也是自带demo,多学学会有收获的

Android 中通过实现线程更新Progressdialog (对话进度条)_Android

作为开发者我们需要经常站在用户角度考虑问题,比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的方式模拟下载进度更新的演示,如图(这里为了截图方便设置对话进度条位于屏幕上方): layout界面代码(仅部署一个按钮): <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.androi

Android 中通过实现线程更新Progressdialog (对话进度条)

作为开发者我们需要经常站在用户角度考虑问题,比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的方式模拟下载进度更新的演示,如图(这里为了截图方便设置对话进度条位于屏幕上方): layout界面代码(仅部署一个按钮): <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.androi