本人做Winform开发多年,孜孜不倦,略有小成,其中收集或者自己开发一些常用的东西,基本上在各个项目都能用到的一些开发经验及知识积累,现逐步介绍一些,以飨读者,共同进步。

 1、窗口【×】关闭按钮变为最小化,并在托盘提示信息

一般有些管理系统,为了防止客户随意关闭程序或者基于其他原因,一般会把 窗口【×】关闭按钮变为最小化,如大家熟悉的飞信、MSN等等,但是有些不是很熟悉的客户,最小化到托盘的时候,却不知道程序到了那里去了,因此,最小化的时候,伴随一个气泡提示信息,显得有一定的必要,如下截图所示。

首先在主窗体的设计界面中添加一个NotifyIcon控件,然后实现相关的代码即可。

下面列出一些关键的代码出来,大家看了应该就知道如何实现了

         private void notifyMenu_Show_Click(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.WindowState = FormWindowState.Maximized;
                this.Show();
                this.BringToFront();
                this.Activate();
                this.Focus();
            }
            else
            {
                this.WindowState = FormWindowState.Minimized;
                this.Hide();
            }
        }

private void notifyMenu_Exit_Click(object sender, EventArgs e)
        {
            try
            {
                this.ShowInTaskbar = false;
                Portal.gc.Quit();
            }
            catch
            {
                // Nothing to do.
            }
        }

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            notifyMenu_Show_Click(sender, e);
        }

private void MainForm_MaximizedBoundsChanged(object sender, EventArgs e)
        {
            this.Hide();
        }

/// <summary>
        /// 缩小到托盘中,不退出
        /// </summary>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            //如果我们操作【×】按钮,那么不关闭程序而是缩小化到托盘,并提示用户.
            if (this.WindowState != FormWindowState.Minimized)
            {
                e.Cancel = true;//不关闭程序

//最小化到托盘的时候显示图标提示信息,提示用户并未关闭程序
                this.WindowState = FormWindowState.Minimized;
                notifyIcon1.ShowBalloonTip(3000, "程序最小化提示",
                     "图标已经缩小到托盘,打开窗口请双击图标即可。",
                     ToolTipIcon.Info);
            }
        }

private void MainForm_Move(object sender, EventArgs e)
        {
            if (this == null)
            {
                return;
            }

//最小化到托盘的时候显示图标提示信息
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Hide();
                notifyIcon1.ShowBalloonTip(3000, "程序最小化提示",
                    "图标已经缩小到托盘,打开窗口请双击图标即可。",
                    ToolTipIcon.Info);
            }
        }

 2、只允许允许一个程序实例,即使是通过虚拟桌面方式连接过来的,也是只允许一个人运行。

这个已经封装好代码了,只需要在Main函数里面调用一下函数即可,允许多个实例会出现下面的对话框提示信息,提示不允许多实例运行,如下所示:

代码如下所示。

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        private static void Main()
        {
            GlobalMutex();

Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

//******启动代码**********
        }

private static Mutex mutex = null;
        private static void GlobalMutex()
        {
            // 是否第一次创建mutex
            bool newMutexCreated = false;
            string mutexName = "Global\\" + "WareHouseMis";//系统名称,Global为全局,表示即使通过通过虚拟桌面连接过来,也只是允许运行一次
            try
            {
                mutex = new Mutex(false, mutexName, out newMutexCreated);
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                System.Threading.Thread.Sleep(1000);
                Environment.Exit(1);
            }

// 第一次创建mutex
            if (newMutexCreated)
            {
                Console.WriteLine("程序已启动");
                //todo:此处为要执行的任务
            }
            else
            {
                MessageUtil.ShowTips("另一个窗口已在运行,不能重复运行。");
                System.Threading.Thread.Sleep(1000);
                Environment.Exit(1);//退出程序
            }

}

3、使用NotifyWindow给用户提示信息

可以通过NotifyWindow类(最后附件中有),做一些信息的提示,方便用户了解一些重要信息的提示,界面较为友好,如下所示:

提示信息的代码使用如下:

        /// <summary>
        /// 弹出提示消息窗口
        /// </summary>
        public void Notify(string caption, string content)
        {
            Notify(caption, content, 400, 200, 5000);
        }

/// <summary>
        /// 弹出提示消息窗口
        /// </summary>
        public void Notify(string caption, string content, int width, int height, int waitTime)
        {
            NotifyWindow notifyWindow = new NotifyWindow(caption, content);
            notifyWindow.TitleClicked += new System.EventHandler(notifyWindowClick);
            notifyWindow.TextClicked += new EventHandler(notifyWindowClick);
            notifyWindow.SetDimensions(width, height);
            notifyWindow.WaitTime = waitTime;
            notifyWindow.Notify();
        }

private void notifyWindowClick(object sender, EventArgs e)
        {
            //SystemMessageInfo info = BLLFactory<SystemMessage>.Instance.FindLast();
            //if (info != null)
            //{
            //    //FrmEditMessage dlg = new FrmEditMessage();
            //    //dlg.ID = info.ID;
            //    //dlg.ShowDialog();
            //}
        }

4、使用SearchCondion控件,简化查询条件的转化

不管在Winform或者在WebForm中,查询构造条件总是非常繁琐的事情,使用该控件能有效简化代码,提高操作的准确及方便行,这个控件我完成了几年了,一直伴随我处理各种查询操作。

        private string GetConditionSql()
        {
            SearchCondition condition = new SearchCondition();
            condition.AddCondition("ItemName", this.txtName.Text, SqlOperator.Like)
                .AddCondition("ItemBigType", this.txtBigType.Text, SqlOperator.Like)
                .AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like)
                .AddCondition("Specification", this.cmbSpecNumber.Text, SqlOperator.Like)
                .AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like)
                .AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like)
                .AddCondition("Source", this.txtSource.Text, SqlOperator.Like)
                .AddCondition("Note", this.txtNote.Text, SqlOperator.Like)
                .AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like)
                .AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.LikeStartAt);
            string where = condition.BuildConditionSql().Replace("Where", "");

return where;
        }

可以构造条件后,传入查询函数,实现数据的查询。

            string where = GetConditionSql();
            List<ItemDetailInfo> list = BLLFactory<ItemDetail>.Instance.Find(where, this.winGridViewPager1.PagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ItemDetailInfo>(list);
            this.winGridViewPager1.PrintTitle = Portal.gc.gAppUnit + " -- " + "备件信息报表";

最后呈上代码用到的一些类库及控件:http://files.cnblogs.com/wuhuacong/WinformTips.rar

本文转自博客园伍华聪的博客,原文链接:Winform开发几个常用的开发经验及知识积累(一),如需转载请自行联系原博主。

Winform开发几个常用的开发经验及知识积累(一)相关推荐

  1. WinForm开发,窗体显示和窗体传值相关知识总结

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法: Form.ShowDialo ...

  2. Java 开发常用的 Linux 命令知识积累

    来源 | siye1982.github.io/2016/02/25/linux-list/ 写在前面 基本操作 Linux关机,重启 查看系统,CPU信息 建立软连接 rpm相关 sshkey 命令 ...

  3. Flutter 开发中最实用的 Dart 语法知识

    零.前言 都说 Flutter 是谷歌的新宠,这段时间有空,就学习了一下 Dart 语法.本篇文章将会详细全面的介绍 Dart 常用语法. 一.变量和常量 在 Drat 语言中,一切皆对象,对象的默认 ...

  4. Winform开发的界面处理优化

    在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到 ...

  5. C# WinForm开发系列 - GDI+【转】

    http://blog.csdn.net/blue_sky6/article/details/53811435?locationNum=6&fps=1 C# WinForm开发系列 - GDI ...

  6. [转载]C# WinForm开发系列 - 文章索引

    该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm ...

  7. C# WinForm开发系列

    文章来源:博客园 该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自 ...

  8. c# Winform 开发分屏显示应用程序

    c# Winform 开发分屏显示应用程序 原文 http://blog.csdn.net/soft2buy/article/details/7082668 分屏显示即可把一台主机内运行的多个程序分别 ...

  9. .Net Winform 开发笔记(四) 透过现象看本质

    写在前面: 从一个窗体的创建显示,再到与用户的交互,最后窗体关闭,这中间经历过了一系列复杂的过程,本文将从Winform应用程序中的Program.cs文件的第一行代码开始,逐步分析一个Winform ...

最新文章

  1. 载 Kubernetes和OpenStack到底是什么关系?先搞清楚,再系列学习
  2. Aave 上线 AMM Market,允许 Uniswap 和 Balancer 的流动性提供商使用 LP 代币作为抵押品
  3. office 在线浏览和编辑 部署 Office Web Apps Server
  4. mysql中首字母大写的函数,如何借助MySQL函数将字符串的首字母大写?
  5. arch linux 安装 键盘,Arch Linux安装
  6. 软件开发入门自学指南
  7. 表白代码(纯干货),送给你爱的人
  8. HotPDF Delphi PDF1.7,上传和编辑所有类型的PDF文件
  9. XX和OO(南阳oj1159)
  10. roc曲线怎么绘制_Excel怎么绘制曲线图?Excel绘制曲线图教程
  11. 清除计算机用户缓存,如何清除电脑的内存缓存?
  12. 5.交换机环路与VLAN
  13. java 微信获取用户地理位置_Java微信公众平台开发之获取地理位置
  14. gpio操作实现人体感应灯(一)
  15. ZZULIOJ 2411: 摘柿子
  16. 马克鳗标记及文字图片工具安装步骤mac版本
  17. 利用绝对值编码器计算odom阿克曼运动学模型
  18. 魔法王座微端不显示服务器,魔法王座无法登陆卡顿等常见问题解决方法
  19. 2017年蓝桥杯C组真题及解析
  20. IJCAI 2018 阿里妈妈广告预测算法大赛

热门文章

  1. UA PHYS515A 电磁理论V 电磁波与辐射6 波导
  2. 数据库多对多关系示例 - 使用sqlite演示
  3. 电脑不能上网学习总结
  4. 一个sqlserver数据库表查看与备份软件
  5. cookie的相关知识
  6. POJ 3616 Milking Time
  7. python 线程之threading(五)
  8. 1010 [HNOI2008]玩具装箱toy
  9. nodejs async
  10. 博客园7月底至8月初51Aspx源码发布详情