前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示。

实现:在经过多方面查询资料,终于是实现了一个完整的loading框程序,这里主要解决在多次点击查询按钮或者加载数据时出现的:执行 CreateHandle() 时无法调用值 Close()或者无法访问已释放的对象或者在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。这三个问题困扰我很久,最终通过不断的调试,将其解决,话不多说,直接上代码。

1.下面类为loading框帮助类,在实际调用过程中,使用该类调用相关函数即可。

  1. class LoadingHelper
  2. {
  3. #region 相关变量定义
  4. /// <summary>
  5. /// 定义委托进行窗口关闭
  6. /// </summary>
  7. private delegate void CloseDelegate();
  8. private static LoaderForm loadingForm;
  9. private static readonly Object syncLock = new Object(); //加锁使用
  10.  
  11. #endregion
  12.  
  13. private LoadingHelper()
  14. {
  15.  
  16. }
  17.  
  18. /// <summary>
  19. /// 显示loading框
  20. /// </summary>
  21. public static void ShowLoadingScreen()
  22. {
  23. // Make sure it is only launched once.
  24. if (loadingForm != null)
  25. return;
  26. Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowForm));
  27. thread.IsBackground = true;
  28. thread.SetApartmentState(ApartmentState.STA);
  29. thread.Start();
  30.  
  31. }
  32.  
  33. /// <summary>
  34. /// 显示窗口
  35. /// </summary>
  36. private static void ShowForm()
  37. {
  38. if (loadingForm != null)
  39. {
  40. loadingForm.closeOrder();
  41. loadingForm = null;
  42. }
  43. loadingForm = new LoaderForm();
  44. loadingForm.TopMost = true;
  45. loadingForm.ShowDialog();
  46. }
  47.  
  48. /// <summary>
  49. /// 关闭窗口
  50. /// </summary>
  51. public static void CloseForm()
  52. {
  53. Thread.Sleep(); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
  54. if (loadingForm != null)
  55. {
  56. lock (syncLock)
  57. {
  58. Thread.Sleep();
  59. if (loadingForm != null)
  60. {
  61. Thread.Sleep(); //通过三次延时,确保可以彻底关闭窗口
  62. loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
  63. }
  64. }
  65. }
  66. }
  67.  
  68. /// <summary>
  69. /// 关闭窗口,委托中使用
  70. /// </summary>
  71. private static void CloseFormInternal()
  72. {
  73.  
  74. loadingForm.closeOrder();
  75. loadingForm = null;
  76.  
  77. }
  78.  
  79. }

2.LoaderForm窗体具体代码如下。

  1. public partial class LoaderForm : Form
  2. {
  3.  
  4. public LoaderForm()
  5. {
  6. InitializeComponent();
  7. }
  8.  
  9. /// <summary>
  10. /// 关闭命令
  11. /// </summary>
  12. public void closeOrder()
  13. {
  14. if (this.InvokeRequired)
  15. {
  16. //这里利用委托进行窗体的操作,避免跨线程调用时抛异常,后面给出具体定义
  17. CONSTANTDEFINE.SetUISomeInfo UIinfo = new CONSTANTDEFINE.SetUISomeInfo(new Action(() =>
  18. {
  19. while (!this.IsHandleCreated)
  20. {
  21. ;
  22. }
  23. if (this.IsDisposed)
  24. return;
  25. if (!this.IsDisposed)
  26. {
  27. this.Dispose();
  28. }
  29.  
  30. }));
  31. this.Invoke(UIinfo);
  32. }
  33. else
  34. {
  35. if (this.IsDisposed)
  36. return;
  37. if (!this.IsDisposed)
  38. {
  39. this.Dispose();
  40. }
  41. }
  42. }
  43.  
  44. private void LoaderForm_FormClosing(object sender, FormClosingEventArgs e)
  45. {
  46. if (!this.IsDisposed)
  47. {
  48. this.Dispose(true);
  49. }
  50.  
  51. }
  52.  
  53. }

对LoaderForm窗体相关说明:

1. public delegate void SetUISomeInfo(); //定义一个委托,处理UI相关信息问题

2.LoaderForm窗体上放置了一个label,将其AutoSize属性设置为false,并将LoaderForm的TransparencyKey属性设置为Transparent(这样设置避免在加载loading框时出现背景,loading.gif最好选择透明背景的图片)

至此,一个完整的loading框,已经搞定。By Shawn chen 2017.7.2晚

WinForm下的loading框实现的更多相关文章

  1. WinForm下的loading框的实现

    前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示. 实现:在经过多方面查询资料, ...

  2. winform下的智能提示框

    winform下的智能提示框 最近在搞winform的程序,接触到有些可能以后还会用到的功能,所以写到博客园里去,第一可以加深自己的印象,第二可以在以后再遇到同样问题的时候忘记了可以马上回来看看,第三 ...

  3. 关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理

    近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉. 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来 ...

  4. WinForm下开发插件DevExpress安装及使用

    WinForm下开发插件DevExpress安装及使用在Visual Studio中安装DevExpress开发插件插件的使用方法简单的Demo介绍下载链接:https://pan.baidu.com ...

  5. C#winform如何实现文本编辑框(TextBox)的Hint提示文字效果

    C#winform如何实现文本编辑框(TextBox)的Hint提示文字效果 private const int EM_SETCUEBANNER = 0x1501; [DllImport(" ...

  6. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

  7. 分享在winform下实现模块化插件编程-优化版

    上一篇<分享在winform下实现模块化插件编程>已经实现了模块化编程,但我认为不够完美,存在以下几个问题: 1.IAppContext中的CreatePlugInForm方法只能依据完整 ...

  8. java、easyui-combotree树形下拉选择框

    最近一直在研究这个树形的下拉选择框,感觉非常的有用,现在整理下来供大家使用: 首先数据库的表架构设计和三级菜单联动的表结构是一样,(父子关系) 1.下面我们用hibernate建一下对应的额实体类: ...

  9. 分享在winform下实现模块化插件编程

    其实很早之前我就已经了解了在winform下实现插件编程,原理很简单,主要实现思路就是:先定一个插件接口作为插件样式及功能的约定,然后具体的插件就去实现这个插件接口,最后宿主(应用程序本身)就利用反射 ...

随机推荐

  1. 【推荐】地推统计结算工具SDK,手机开发首选

    地推是推广app的一种重要手段,同时地推结算对地推统计的精度的要求非常高,而openinstall就是一款符合要求的地推统计结算工具.它不仅多渠道统计能力强,安装设备识别精准,渠道统计精度高.还支持地 ...

  2. 记录下 Markdown 语法

    github上常用markdown语法:Mastering Markdown 目录 0. 目录 1. 锚点 2.标题 3.超链接 3.1.行内式 3.2.自动链接 4.列表 4.1.有序列表 4.2. ...

  3. Spring AOP分析(1) -- 基本概念

    AOP全称是Aspect Oriented Programming,面向切面编程,是面向对象编程(OOP:Object Oriented Programming)的补充和完善.一般在系统中,OOP利用 ...

  4. linq 在查询表达式中处理异常

    在查询表达式的上下文中可以调用任何方法. 但是,我们建议避免在查询表达式中调用任何会产生副作用(如修改数据源内容或引发异常)的方法. 此示例演示在查询表达式中调用方法时如何避免引发异常,而不违反有关异 ...

  5. jsonp跨域实现

    原理:借助script可以跨域的思想,将跨域请求放在script中,当页面解析到改script标签时,就会向该src指向的地址发出一个请求,达到跨域请求的目的. 两点:(1)主要是利用了 <sc ...

  6. Linux学习(十九)软件安装与卸载(二)更换yum源

    一.简介 系统自带的源数量有限,而且是国外的源,速度肯定不如国内的.而断网的时候,本地源就可以派得上用处.而RPMForge源是传说中规模最大的一个源.那么接下来我们就来分别配一下本地源,国内源,RP ...

  7. linux-touch

    linux-touch 用于创建文件或者更新文件的修改日期 命令参数 - d yyyymmdd:把文件的存取或修改时间改为  yyyy年mm月dd日 - a :只把文件的存取时间改成当前时间 - m: ...

  8. 大话git中的撤销操作

    下面以现实场景作为情境. 基础知识,理解git中的几个区域 本地代码已经add,未commit 修改本地工作目录中的readme.md,添加文字"第一次修改" 然后查看下状态 ➜ ...

  9. elastic-search单机部署以及中文分词IKAnalyzer安装

    前提条件 elasticsearch使用版本5.6.3,需要jdk版本1.8,低于该版本不能使用 下载 https://artifacts.elastic.co/downloads/elasticse ...

  10. pandas选择数据-【老鱼学pandas】

    选择列 根据列名来选择某列的数据 import pandas as pd import numpy as np dates = pd.date_range("2017-01-08" ...