日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)C#.NET → 自己制作C#進度窗體

      自己制作C#進度窗體

      相關軟件相關文章發(fā)表評論 來源:ByStander翻譯時間:2012/10/10 9:30:24字體大。A-A+

      作者:佚名點擊:96次評論:0次標簽: C#

      這是我在CodeProject上的第一篇文章。我希望對你有用

      當我開發(fā)軟件的時候。我通常因為一個很耗時是任務需要完成。而請求讓用戶等待,并且通過也允許用戶取消。不論我做何種操作(比如下載文件。保存大文件等等)。我都需要做下面幾件事:

      通過一個模態(tài)對話框來讓用戶等待操作完成

      能讓用戶看到進度。

      能讓用戶隨時取消。

      我搜了好久也沒找到拿來就能用的窗體控件,也許是我沒找到。于是我自己寫。。
      圖1

      背景

      BackgroundWorker 類包含了我需要完成任務的所有東西。我只需要給他提供一個對話框。

      使用代碼

      ProgressForm 包含了一個BackgroundWorker ,你要做的僅僅就是提供了一個完成工作的方法。

      ProgressForm form = new ProgressForm();
      form.DoWork += new ProgressForm.DoWorkEventHandler(form_DoWork);
      //如果想為后臺任務提供參數(shù)的話
      form.Argument = something;

      為了開始BackgroundWorker,只需要調用ShowDialog 方法。返回值則取決于任務是怎么完成的。

      DialogResult result = form.ShowDialog();
      if (result == DialogResult.Cancel)
      {
      //用戶點擊了取消
      }
      else if (result == DialogResult.Abort)
      {
      /未處理的異常拋出
      //你可以得到異常信息
      MessageBox.Show(form.Result.Error.Message);
      }
      else if (result == DialogResult.OK)
      {
      //正常完成
      //結果存儲在 form.Result里
      }

      最后。任務方法看起來是這樣的。

      void form_DoWork(ProgressForm sender, DoWorkEventArgs e)
      {
      //得到參數(shù)
      object myArgument = e.Argument;

      //做一些耗時的任務...
      for (int i = 0; i < 100; i++)
      {
      //通知進度
      sender.SetProgress(i, "Step " + i.ToString() + " / 100...");

      //...

      //檢查是否點擊了取消
      if (sender.CancellationPending)
      {
      e.Cancel = true;
      return;
      }
      }
      }

      如果你想要改改進度條,或者進度條顯示的文本。SetProgress 有一些重載的方法

      public void SetProgress(string status);
      public void SetProgress(int percent);
      public void SetProgress(int percent, string status);

      最后一個可自定義的字符串是:有兩個預定義的字符串CancellingText 和DefaultStatusText. CancellingText ,這兩個字符串,當用戶點擊取消的時候顯示

      如何實現(xiàn)
      ProgressForm 緊緊嵌入了一個BackgroundWorker ,并包裝進了主函數(shù)。

      首先。我設計了如圖所示的一個窗體,然后。添加了BackgroundWorker。

      public partial class ProgressForm : Form
      {
      public ProgressForm()
      {
      InitializeComponent();

      worker = new BackgroundWorker();
      worker.WorkerReportsProgress = true;
      worker.WorkerSupportsCancellation = true;
      worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
      worker.ProgressChanged += new ProgressChangedEventHandler(
      worker_ProgressChanged);
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
      worker_RunWorkerCompleted);
      }
      void worker_DoWork(object sender, DoWorkEventArgs e)
      {
      }
      void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
      }
      void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
      }
      BackgroundWorker worker;
      }

      我們必須把DoWork事件暴露給用戶。我添加了一個委托。這樣。我可以很容易的訪問窗體成員

      public delegate void DoWorkEventHandler(ProgressForm sender, DoWorkEventArgs e);
      public event DoWorkEventHandler DoWork;

      void worker_DoWork(object sender, DoWorkEventArgs e)
      {
      //后臺任務開始
      //調用用戶的事件處理程序
      if (DoWork != null)
      DoWork(this, e);
      }

      好。我們已經有了任務和事件。先愛。我們希望當窗體顯示的時候。后臺任務盡可能開始。我們在Load事件中寫代碼

      void ProgressForm_Load(object sender, EventArgs e)
      {
      worker.RunWorkerAsync();
      }
      現(xiàn)在寫一個方法通知進度。添加代碼到ProgressChanged 事件處理程序中

      public void SetProgress(int percent, string status)
      {
      worker.ReportProgress(percent, status);
      }
      void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
      if (e.ProgressPercentage >= progressBar.Minimum &&
      e.ProgressPercentage <= progressBar.Maximum)
      {
      progressBar.Value = e.ProgressPercentage;
      }
      if (e.UserState != null)
      labelStatus.Text = e.UserState.ToString();
      }

      我們快做好了,F(xiàn)在我們添加取消按鈕

      void buttonCancel_Click(object sender, EventArgs e)
      {
      //通過worker我們要取消
      worker.CancelAsync();
      //使取消按鈕不可用,改變狀態(tài)文本
      buttonCancel.Enabled = false;
      labelStatus.Text = "Cancelling..."
      }
      最后一件事是我們想要當worker完成的時候自動關閉窗體,因為我們的worker通過ShowDialog 方法啟動。如果直接接收返回結果會很好

      void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
      //ShowDialog返回值會指示worker是不是正確完成了
      if (e.Error != null)
      DialogResult = DialogResult.Abort;
      else if (e.Cancelled)
      DialogResult = DialogResult.Cancel;
      else
      DialogResult = DialogResult.OK;
      //關閉窗體
      Close();
      }

      主要的工作就完成了。我添加了一些預定義的字符串啊。如果正在取消。保護狀態(tài)不會改變。還有傳遞參數(shù)啊。
      完整的代碼如下:

      /// <summary>
      /// 簡單的進度窗體
      /// </summary>
      public partial class ProgressForm : Form
      {
      /// <summary>
      /// 獲得進度條以對他自定義
      /// 在顯示窗體之前.
      /// 不要在后臺任務中直接使用 !
      /// </summary>
      public ProgressBar ProgressBar { get { return progressBar; } }
      /// <summary>
      /// 傳遞給后臺任務的參數(shù).
      /// </summary>
      public object Argument { get; set; }
      /// <summary>
      /// 后臺任務的結果.
      ///也可以檢查ShowDialog返回值
      ///來看看是不是正確完成了.
      /// </summary>

      public RunWorkerCompletedEventArgs Result { get; private set; }
      /// <summary>
      /// 如果點擊了取消按鈕則為true
      ///后臺任務還在執(zhí)行
      /// </summary>
      public bool CancellationPending
      {
      get { return worker.CancellationPending; }
      }

      /// <summary>
      /// 取消按鈕被點擊之后的顯示文本
      /// </summary>
      public string CancellingText { get; set; }
      /// <summary>
      /// 缺省狀態(tài)文本.
      /// </summary>
      public string DefaultStatusText { get; set; }
      /// <summary>
      /// DoWork事件的委托.
      /// </summary>
      /// <param name="sender">T事件源.</param>
      /// <param name="e">包含事件數(shù)據(jù).</param>
      public delegate void DoWorkEventHandler(ProgressForm sender, DoWorkEventArgs e);
      /// <summary>
      /// 當后臺任務開始的時候發(fā)生.
      /// </summary>
      public event DoWorkEventHandler DoWork;

      /// <summary>
      /// 構造函數(shù).
      /// </summary>
      public ProgressForm()
      {
      InitializeComponent();

      DefaultStatusText = "Please wait...";
      CancellingText = "Cancelling operation...";

      worker = new BackgroundWorker();
      worker.WorkerReportsProgress = true;
      worker.WorkerSupportsCancellation = true;
      worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
      worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
      worker_RunWorkerCompleted);
      }

      /// <summary>
      /// 改變狀態(tài)文本.
      /// </summary>
      /// <param name="status">新狀態(tài)文本.</param>
      public void SetProgress(string status)
      {
      //如果沒有改變
      //或者取消請求還在處理就不改變狀態(tài)文本
      if (status != lastStatus && !worker.CancellationPending)
      {
      lastStatus = status;
      worker.ReportProgress(progressBar.Minimum - 1, status);
      }
      }
      /// <summary>
      ///改變進度條的值
      /// </summary>
      /// <param name="percent">新值.</param>
      public void SetProgress(int percent)
      {
      //如果值沒有改變就不要更新進度條
      if (percent != lastPercent)
      {
      lastPercent = percent;
      worker.ReportProgress(percent);
      }
      }
      /// <summary>
      ///改變進度條值和文本.
      /// </summary>
      /// <param name="percent">N新值.</param>
      /// <param name="status">新文本.</param>
      public void SetProgress(int percent, string status)
      {
      //如果至少一個改變就調用
      if (percent != lastPercent || (status != lastStatus && !worker.CancellationPending))
      {
      lastPercent = percent;
      lastStatus = status;
      worker.ReportProgress(percent, status);
      }
      }

      private void ProgressForm_Load(object sender, EventArgs e)
      {
      //重用窗體,恢復缺省值
      Result = null;
      buttonCancel.Enabled = true;
      progressBar.Value = progressBar.Minimum;
      labelStatus.Text = DefaultStatusText;
      lastStatus = DefaultStatusText;
      lastPercent = progressBar.Minimum;
      //窗體已載入就開始后臺任務
      worker.RunWorkerAsync(Argument);
      }

      private void buttonCancel_Click(object sender, EventArgs e)
      {
      //通知后臺任務,我們要取消
      worker.CancelAsync();
      //取消按鈕不可用,改變文本
      buttonCancel.Enabled = false;
      labelStatus.Text = CancellingText;
      }

      void worker_DoWork(object sender, DoWorkEventArgs e)
      {
      //后臺任務開始
      //調用用戶的處理程序
      if (DoWork != null)
      DoWork(this, e);
      }

      void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
      {
      //確保新值可用并更新
      if (e.ProgressPercentage >= progressBar.Minimum &&
      e.ProgressPercentage <= progressBar.Maximum)
      {
      progressBar.Value = e.ProgressPercentage;
      }
      //如果取消請求正在處理就不要更新
      if (e.UserState != null && !worker.CancellationPending)
      labelStatus.Text = e.UserState.ToString();
      }

      void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
      //后臺任務完成
      //保持結果,關閉窗體
      Result = e;
      if (e.Error != null)
      DialogResult = DialogResult.Abort;
      else if (e.Cancelled)
      DialogResult = DialogResult.Cancel;
      else
      DialogResult = DialogResult.OK;
      Close();
      }

      BackgroundWorker worker;
      int lastPercent;
      string lastStatus;
      }

      結論
      窗體簡單,我通常用。希望對你們也有用

      Demo下載

      源碼和測試下載

      許可
      本文,包括源代碼和文件在CPOL下授權。

        vs2008
        (51)vs2008
        微軟的開發(fā)工具當前是可視化軟件開發(fā)工具的主流,越來越多的從業(yè)人員,將會使用系列開發(fā)工具,提供了的即時編輯和套用的功能。而且,對的支援感覺起來不比差,同時,它還提供了和一樣的,也就是可以一個分割視窗,同時,我們還是可以看到設計畫面和源代碼。相對于的技術不成熟,在使用方面和功能方面趨向完善。...更多>>
        • Visual Studio 2008(vs2008)中文專

          05-15 / 3.75G

          推薦理由:Visual Studio 2008 中文專業(yè)版 vs2008(含MSDN for SP1) 軟件大。 3.84G 軟件語言: 簡體中文 軟件類別:
        • Visual Studio 2008 SP1 補丁(VS20

          09-08 / 848.2M

          推薦理由:微軟Visual Studio 2008 SP1 簡體中文版發(fā)布,VS作為微軟旗艦級的開發(fā)集成環(huán)境最新版2008中加入了對WPF以及
        • Visual Studio 2008中文版

          05-15 / 1.90G

          推薦理由:VS2008的性能改進以及十大新功能Visual Studio 2008的性能改進 在 VS 2008中,我們就開發(fā)人員所關心的一些常
        • Visual Studio 2010vs2010中文旗艦

          02-14 / 2.25G

          推薦理由:Microsoft Visual Studio 2010 專業(yè)版是一個集成環(huán)境,它簡化了有關創(chuàng)建、調試和部署應用程序的基本任務。借
        • Visual Studio 2005(vs2005)簡體中

          05-15 / 1.46G

          推薦理由:需要注意的是:下載后解壓,找到SETUP文件夾下的setup.sdb,用記事本打開它找 到 [Product Key],將下面的一
        • MSDN Library for Visual Studio 2

          05-15 / 1.58G

          推薦理由:MSDN Library for Microsoft Visual Studio 2005,msdn幫助文件,從 VS2005的安裝DVD光盤中分離出來的. MSDN

        相關評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經過審核才能顯示)