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

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

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

 class LoadingHelper
 {
         #region 相关变量定义
         /// <summary>
         /// 定义委托进行窗口关闭
         /// </summary>
         private delegate void CloseDelegate();
         private static LoaderForm loadingForm;
         private static readonly Object syncLock = new Object();  //加锁使用

         #endregion

         private LoadingHelper()
         {

         }

         /// <summary>
         /// 显示loading框
         /// </summary>
         public static void ShowLoadingScreen()
         {
             // Make sure it is only launched once.
             if (loadingForm != null)
                 return;
             Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowForm));
             thread.IsBackground = true;
             thread.SetApartmentState(ApartmentState.STA);
             thread.Start();

         }

         /// <summary>
         /// 显示窗口
         /// </summary>
         private static void ShowForm()
         {
             if (loadingForm != null)
             {
                 loadingForm.closeOrder();
                 loadingForm = null;
             }
             loadingForm = new LoaderForm();
             loadingForm.TopMost = true;
             loadingForm.ShowDialog();
         }

         /// <summary>
         /// 关闭窗口
         /// </summary>
         public static void CloseForm()
         {
             Thread.Sleep(); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
             if (loadingForm != null)
             {
                 lock (syncLock)
                 {
                     Thread.Sleep();
                     if (loadingForm != null)
                     {
                         Thread.Sleep();  //通过三次延时,确保可以彻底关闭窗口
                         loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
                     }
                 }
             }
         }

         /// <summary>
         /// 关闭窗口,委托中使用
         /// </summary>
         private static void CloseFormInternal()
         {

             loadingForm.closeOrder();
             loadingForm = null;

         }

     }                                                                                                                                        

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

 public partial class LoaderForm : Form
 {

         public LoaderForm()
         {
             InitializeComponent();
         }

         /// <summary>
         /// 关闭命令
         /// </summary>
         public void closeOrder()
         {
             if (this.InvokeRequired)
             {
                 //这里利用委托进行窗体的操作,避免跨线程调用时抛异常,后面给出具体定义
                 CONSTANTDEFINE.SetUISomeInfo UIinfo = new CONSTANTDEFINE.SetUISomeInfo(new Action(() =>
                 {
                     while (!this.IsHandleCreated)
                     {
                         ;
                     }
                     if (this.IsDisposed)
                         return;
                     if (!this.IsDisposed)
                     {
                         this.Dispose();
                     }

                 }));
                 this.Invoke(UIinfo);
             }
             else
             {
                 if (this.IsDisposed)
                     return;
                 if (!this.IsDisposed)
                 {
                     this.Dispose();
                 }
             }
         }

         private void LoaderForm_FormClosing(object sender, FormClosingEventArgs e)
         {
             if (!this.IsDisposed)
             {
                 this.Dispose(true);
             }

         }

 }        

对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. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  2. 在windows下,将mysql离线数据文件导入本地mysql数据库

    1. 查看mysql路径 SELECT @@basedir AS basePath FROM DUAL 其实mysql5.6 的数据文件在 C:\ProgramData\MySQL\MySQL Ser ...

  3. setsockopt()和getsockopt()函数参数

    setsockopt()函数功能介绍 功能描述: 获取或者设置与某个套接字关联的选项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为 ...

  4. 深度学习系列 Part (2)

    1. 神经网络原理 神经网络模型,是上一章节提到的典型的监督学习问题,即我们有一组输入以及对应的目标输出,求最优模型.通过最优模型,当我们有新的输入时,可以得到一个近似真实的预测输出. 我们先看一下如 ...

  5. Ajax通过FormData上传文件

    1.使用<form>表单初始化FormData对象方式上传文件 HTML代码 <form id="uploadForm" enctype="multip ...

  6. scp命令,用来在本地和远程相互传递文件,非常方便

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  7. 安装Windows Azure Powershell

    本文将介绍如何安装Windows Azure Powershell 1.打开Azure官方链接:https://www.azure.cn/downloads/ 2.按照向导进行安装 3.打开系统自带的 ...

  8. iOS 中的 Delayed Transition

    Android 的动画体系中,存在一类由 TransitionManager. beginDelayedTransition 管理的动画.这个方法,很特殊.执行此方法后,其后续的 UI 变化,不会立即 ...

  9. ldap数据库--ODSEE--卸载

    针对ldap实例的卸载,即删除,可以通过管理界面进行操作也可以通过命令行进行操作.卸载顺序为ldap实例--agent--ads.这里主要介绍命令操作步骤 1,ldap实例卸载 从ads注销,即不在需 ...

  10. chrony软件使用说明

    1.1.1 chrony简介 Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后 ...