好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Winform开发的常用类库

Winform开发的常用类库

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(14)---Winform开发的常用类库(终结篇,CHM文档放送)

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。

本篇的公用类库的介绍主题是程序开发中常用到的一些辅助类,在帮助文档中归类到其他目录下面,本篇主要介绍在Winform开发用,常用到的一些类库,包括Windows服务操作、DOS操作、串口操作、POS打印操作以及一些参加的界面控件的辅助类。

本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公用类库的接口方法以及详细使用操作,力求给自己继续优化,积攒更丰富的公用类库资源,加深了解的同时,也给大家展现公用类库好的方面。

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(13)--- 各种常用的辅助类2

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(12)--- 网络相关操作辅助类
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(11)---各种线程相关操作类
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(10)---各种线程同步的集合类

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)----各种常用辅助类
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)-----声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关  
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(5)----热键、多线程、窗体动画冻结等窗体操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)----CSV、Excel、INI文件、独立存储等文件相关
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(3)----数据库相关操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)----常用操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)----开篇总结

至此,整个厚积薄发的类库整理也落下帷幕,整个过程历时一年多,整理优化近两百多个类库,帮助说明近两百个。本篇作为本系列的终结篇,贴出最终的 CHM帮助文档 ,以及最有的 类库DLL ,如果需要进一步了解整个类库的信息,可以随时联系我。

CHM帮助文档持续更新中,统一下载地址是:  http://www.iqidi.com/download/commonshelp.rar 

最新公用类库DLL+XML注释文件下载地址是: https://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

整个帮助类库的CHM文件概况如下所示。

1、 Window服务辅助类WinServiceHelper,包括安装、卸载、启动、停止、重新启动、判断服务是否存在等操作。

本辅助类主要是用来方便实现Window服务的各种操作,包括安装、卸载、启动、停止、重新启动、判断服务是否存在等操作。 Window服务适用于个各种定时服务,或者数据同步的操作中。

1)辅助类提供的方法接口如下所示:

 ///   安装Windows服务    
  ///   </summary>     
 ///   <param name="serviceName">  服务名称  </param>     
 ///   <param name="serviceFileName">  服务文件路径  </param>     
 ///   <returns></returns>     
 public   static   bool  InstallService( string  serviceName,  string   serviceFileName)    
   
  ///   <summary>     
 ///   卸载Windows服务    
  ///   </summary>     
 ///   <param name="serviceName">  服务名称  </param>     
 ///   <param name="serviceFileName">  服务文件路径  </param>     
 public   static   bool  UnInstallService( string  serviceName,  string   serviceFileName)    
   
  ///   <summary>     
 ///   另外一种安装、卸载Windows服务的方法    
  ///   </summary>     
 ///   <param name="install">  安装还是卸载,true为安装,false为卸载  </param>     
 ///   <param name="serviceFileName"></param>     
 public   static   void  InstallService2( bool  install,  string   serviceFileName)    
   
  ///   <summary>     
 ///   判断window服务是否存在    
  ///   </summary>     
 ///   <param name="serviceName">  window服务名称  </param>     
 ///   <returns></returns>     
 public   static   bool  ServiceIsExisted( string   serviceName)    
   
  ///   <summary>     
 ///   等待某种预期的状态(如运行,停止等)    
  ///   </summary>     
 ///   <param name="serviceName">  window服务名称  </param>     
 ///   <param name="status">  预期的状态  </param>     
 ///   <param name="second">  如果获取不到预期的状态,则等待多少秒  </param>     
 ///   <returns></returns>     
 public   static   bool  WaitForStatus( string  serviceName, ServiceControllerStatus status,  int   second)    
   
  ///   <summary>     
 ///   启动window服务    
  ///   </summary>     
 ///   <param name="serviceName"></param>     
 public   static   bool  StartService( string   serviceName)    
   
  ///   <summary>     
 ///   停止服务    
  ///   </summary>     
 ///   <param name="serviseName"></param>     
 ///   <returns></returns>     
 public   static   bool  StopService( string   serviseName)    
   
  ///   <summary>     
 ///   修改服务的启动项 2为自动,3为手动    
  ///   </summary>     
 ///   <param name="startType"></param>     
 ///   <param name="serviceName"></param>     
 ///   <returns></returns>     
 public   static   bool  ChangeServiceStartType( int  startType,  string   serviceName)    
   
  ///   <summary>     
 ///   获取服务启动类型 2为自动 3为手动 4 为禁用    
  ///   </summary>     
 ///   <param name="serviceName"></param>     
 ///   <returns></returns>     
 public   static   string  GetServiceStartType( string   serviceName)    
   
  ///   <summary>     
 ///   验证服务是否启动    
  ///   </summary>     
 ///   <returns></returns>     
 public   static   bool  ServiceIsRunning( string  serviceName)   

2)辅助类的使用例子代码如下所示

 private   void   CheckServcieStatus()    
{    
      string  serviceName =  this  .txtServiceName.Text;    
      bool  exist =  WinServiceHelper.ServiceIsExisted(serviceName);    
      if   (exist)    
    {   
          #region  获取转换状态    
         string  startType =  WinServiceHelper.GetServiceStartType(serviceName);    
          string  startTypeStatus =  ""  ;    
          if  (startType ==  "  2  "  )    
        {    
            startTypeStatus  =  "  自动  "  ;    
        }    
          else   if  (startType ==  "  3  "  )    
        {    
            startTypeStatus  =  "  手动  "  ;    
        }    
          else   if  (startType ==  "  4  "  )    
        {    
            startTypeStatus  =  "  禁用  "  ;    
        }    
          #endregion     
   
         bool  running =  WinServiceHelper.ServiceIsRunning(serviceName);    
          this .txtServiceStatus.Text =  string .Format( "  启动类型:{0} 状态:{1}  " , startTypeStatus, running ?  "  正在运行  "  :  "  已停止  "  );    
          this .txtServiceStatus.BackColor = Color.FromArgb( 255 ,  255 ,  192  );    
   
          this .btnStartService.Enabled = ! running;    
          this .btnStopService.Enabled =  running;    
          this .btnReset.Enabled =  true  ;    
          this .btnInstallService.Enabled =  false  ;    
          this .btnUnInstallService.Enabled =  true  ;    
    }    
      else     
    {    
          this .txtServiceStatus.BackColor =  Color.Red;    
          this .txtServiceStatus.Text =  string .Format( "  {0} 服务不存在  "  , serviceName);    
          this .btnStartService.Enabled =  false  ;    
          this .btnStopService.Enabled =  false  ;    
          this .btnReset.Enabled =  false  ;    
          this .btnInstallService.Enabled =  true  ;    
          this .btnUnInstallService.Enabled =  false  ;    
    }                
}   

以上代码摘自我的《  Winform开发框架之通用定时服务管理 》

2、DOS操作封装辅助类 DosHelper。

本辅助类主要是用来方便实现DOS操作。DOS操作在自定义安装数据库脚本、运行特殊命令、后台注册控件、操作Windows Service等方面都有用到。在另一个辅助类SqlScriptHelper,就是采用运行DOS命令方式进行Sql脚本的数据库安装。

1)辅助类提供的方法接口如下所示

 ///   <summary>     
 ///   后台执行DOS文件    
  ///   </summary>     
 ///   <param name="fileName">  文件名(包含路径)  </param>     
 ///   <param name="argument">  运行参数  </param>     
 ///   <param name="hidden">  是否隐藏窗口  </param>     
 public   static   void  RunDos( string  fileName,  string  argument,  bool   hidden)    
   
  ///   <summary>        
 ///   运行指定DOS命令行       
  ///   </summary>        
 ///   <param name="fileName">  命令  </param>        
 ///   <param name="argument">  命令行参数  </param>        
 ///   <param name="hidden">  是否隐藏窗口  </param>      
 ///   <param name="confirm">  写入命令行的确认信息  </param>        
 ///   <returns></returns>        
 public   static   string  ExecuteCMD( string  fileName,  string  argument,  bool  hidden,  string   confirm)    
   
  ///   <summary>     
 ///   同步方式执行DOS命令    
  ///   </summary>     
 ///   <param name="command">  DOS命令  </param>     
 public   static   void  ExecuteCommandSync( object   command)    
   
  ///   <summary>     
 ///   异步方式执行DOS命令    
  ///   </summary>     
 ///   <param name="command">  DOS命令字符串  </param>     
 public   static   void  ExecuteCommandAsync( string  command)  

2)辅助类的使用例子代码如下所示

 private   void  btnInstallService_Click( object   sender, EventArgs e)    
{    
      if   (CheckInput())    
    {    
        DosHelper.RunDos(servicefile,   "  -i  " ,  false  );    
   
        WinServiceHelper.WaitForStatus(  this .txtServiceName.Text, ServiceControllerStatus.Running,  10  );    
   
        CheckServcieStatus();    
    }    
}    
   
  private   void  btnUnInstallService_Click( object   sender, EventArgs e)    
{    
      if   (CheckInput())    
    {    
        DosHelper.RunDos(servicefile,   "  -u  " ,  false  );    
        Thread.Sleep(  1000  );    
   
        CheckServcieStatus();    
    }     

以上代码摘自我的《  Winform开发框架之通用定时服务管理 》

3、串口开发辅助类 SerialPortUtil

一般人可能开发C#相关的项目很多年,不一定会接触到串口的开发,了解熟悉对硬件串口的开发,串口也不再是什么神秘的东西,利用SerailPort组件,对串口的各种操作也非常的方便,由于本人总是喜欢把一些常用的东西封装成可供重复利用的类库,因此,在阅百家代码,项目积累总结的基础上,提炼总结优化,把对串口的操作封装成一个公用的类库,应付日常的串口编程开发,也算是工作的一个阶段性总结吧。

微软在 .NET FrameWork2.0中对串口通讯进行了封装,我们可以在.net2.0及以上版本开发时直接使用SerialPort类对串口进行读写操作。

 

SerialPort类的属性主要包括:

    1)串口名称(PortName) 

    2)波特率(BaudRate)

    3)数据位 DataBits

    4)停止位 StopBits
    5)奇偶校验 Parity 

 

SerialPort类的事件主要包括:

    DataReceived:用于异步接收串口数据事件

    ErrorReceived:错误处理事件

SerialPort类的方法主要包括: 

    Open();Close();Read();Write()、DiscardInBuffer()、DiscardOutBuffer()等

从上面的测试例子图中,我们可以看到,一般对串口的操作,需要提供串口号、波特率、数据位、停止位、奇偶校验的参数,用来构造一个串口操作类,以便实现具体的串口操作,而这些参数有的是系统内置的枚举参数,我们可以通过遍历枚举对象来绑定下来列表(如停止位、奇偶校验);但有些参数却不是系统内置的枚举类型,例如波特率、数据位等,而且对这些参数操作也是串口开发经常用到的,因此,第一步,我对这些参数的绑定做了一个简单的封装。

1)辅助类的接口代码如下所示。

     ///   <summary> 
     ///   串口开发辅助类
      ///   </summary> 
     public   class   SerialPortUtil
    {
          ///   <summary> 
         ///   接收事件是否有效 false表示有效
          ///   </summary> 
         public   bool  ReceiveEventFlag =  false  ;
          ///   <summary> 
         ///   结束符比特
          ///   </summary> 
         public   byte  EndByte =  0x23 ; //  string End = "#"; 

         ///   <summary> 
         ///   完整协议的记录处理事件
          ///   </summary> 
         public   event   DataReceivedEventHandler DataReceived;
          ///   <summary> 
         ///   严重错误事件处理
          ///   </summary> 
         public   event   SerialErrorReceivedEventHandler Error;

          ///   <summary> 
         ///   串口号
          ///   </summary> 
         public   string   PortName

          ///   <summary> 
         ///   波特率
          ///   </summary> 
         public   SerialPortBaudRates BaudRate

          ///   <summary> 
         ///   奇偶校验位
          ///   </summary> 
         public   Parity Parity

          ///   <summary> 
         ///   数据位
          ///   </summary> 
         public   SerialPortDatabits DataBits

          ///   <summary> 
         ///   停止位
          ///   </summary> 
         public   StopBits StopBits

          #endregion 

         #region  构造函数

         ///   <summary> 
         ///   参数构造函数(使用枚举参数构造)
          ///   </summary> 
         ///   <param name="baud">  波特率  </param> 
         ///   <param name="par">  奇偶校验位  </param> 
         ///   <param name="sBits">  停止位  </param> 
         ///   <param name="dBits">  数据位  </param> 
         ///   <param name="name">  串口号  </param> 
         public  SerialPortUtil( string   name, SerialPortBaudRates baud, Parity par, SerialPortDatabits dBits, StopBits sBits)

          ///   <summary> 
         ///   参数构造函数(使用字符串参数构造)
          ///   </summary> 
         ///   <param name="baud">  波特率  </param> 
         ///   <param name="par">  奇偶校验位  </param> 
         ///   <param name="sBits">  停止位  </param> 
         ///   <param name="dBits">  数据位  </param> 
         ///   <param name="name">  串口号  </param> 
         public  SerialPortUtil( string  name,  string  baud,  string  par,  string  dBits,  string   sBits)

          ///   <summary> 
         ///   默认构造函数
          ///   </summary> 
         public   SerialPortUtil()

          #endregion 

         ///   <summary> 
         ///   端口是否已经打开
          ///   </summary> 
         public   bool   IsOpen

          ///   <summary> 
         ///   打开端口
          ///   </summary> 
         ///   <returns></returns> 
         public   void   OpenPort()

          ///   <summary> 
         ///   关闭端口
          ///   </summary> 
         public   void   ClosePort()

          ///   <summary> 
         ///   丢弃来自串行驱动程序的接收和发送缓冲区的数据
          ///   </summary> 
         public   void   DiscardBuffer()

          #region  数据写入操作

         ///   <summary> 
         ///   写入数据
          ///   </summary> 
         ///   <param name="msg"></param> 
         public   void  WriteData( string   msg)

          ///   <summary> 
         ///   写入数据
          ///   </summary> 
         ///   <param name="msg">  写入端口的字节数组  </param> 
         public   void  WriteData( byte  [] msg)

          ///   <summary> 
         ///   写入数据
          ///   </summary> 
         ///   <param name="msg">  包含要写入端口的字节数组  </param> 
         ///   <param name="offset">  参数从0字节开始的字节偏移量  </param> 
         ///   <param name="count">  要写入的字节数  </param> 
         public   void  WriteData( byte [] msg,  int  offset,  int   count)

          ///   <summary> 
         ///   发送串口命令
          ///   </summary> 
         ///   <param name="SendData">  发送数据  </param> 
         ///   <param name="ReceiveData">  接收数据  </param> 
         ///   <param name="Overtime">  重复次数  </param> 
         ///   <returns></returns> 
         public   int  SendCommand( byte [] SendData,  ref    byte [] ReceiveData,  int   Overtime)

          #endregion 

         #region  常用的列表数据获取和绑定操作

         ///   <summary> 
         ///   封装获取串口号列表
          ///   </summary> 
         ///   <returns></returns> 
         public   static   string  [] GetPortNames()

          ///   <summary> 
         ///   设置串口号
          ///   </summary> 
         ///   <param name="obj"></param> 
         public   static   void   SetPortNameValues(ComboBox obj)

          ///   <summary> 
         ///   设置波特率
          ///   </summary> 
         public   static   void   SetBauRateValues(ComboBox obj)

          ///   <summary> 
         ///   设置数据位
          ///   </summary> 
         public   static   void   SetDataBitsValues(ComboBox obj)

          ///   <summary> 
         ///   设置校验位列表
          ///   </summary> 
         public   static    void   SetParityValues(ComboBox obj)

          ///   <summary> 
         ///   设置停止位
          ///   </summary> 
         public   static   void   SetStopBitValues(ComboBox obj)

          #endregion 

         ///   <summary> 
         ///   检查端口名称是否存在
          ///   </summary> 
         ///   <param name="port_name"></param> 
         ///   <returns></returns> 
         public   static   bool  Exists( string   port_name)

          ///   <summary> 
         ///   格式化端口相关属性
          ///   </summary> 
         ///   <param name="port"></param> 
         ///   <returns></returns> 
         public   static   string   Format(SerialPort port)
    } 

2)辅助类的使用代码如下所示。

绑定相应的数据源(包括端口、波特率、数据位、校验位等等)代码如下所示,这样我们在窗体界面代码中,绑定相关参数的数据源就很方便了,如下所示。

 private   void  Form1_Load( object   sender, EventArgs e)    
  {    
      BindData();    
  }    
   
    private   void   BindData()    
  {    
        //  绑定端口号     
       SerialPortUtil.SetPortNameValues(txtPort);    
      txtPort.SelectedIndex  =  0  ;    
   
        //  波特率     
       SerialPortUtil.SetBauRateValues(txtBaudRate);    
      txtBaudRate.SelectedText  =  "  57600  "  ;    
   
        //  数据位     
       SerialPortUtil.SetDataBitsValues(txtDataBits);    
        this .txtDataBits.SelectedText =  "  8  "  ;    
   
        //  校验位     
       SerialPortUtil.SetParityValues(txtParity);    
        this .txtParity.SelectedIndex =  0  ;    
   
        //  停止位     
       SerialPortUtil.SetStopBitValues(txtStopBit);    
        this .txtStopBit.SelectedIndex =  1  ;    
        
        this .btnSend.Enabled =  isOpened;    
  } 

辅助类实现连接特定的窗口并处理数据的操作代码如下所示。

  private   void  btnConnect_Click( object   sender, EventArgs e)    
 {    
       try     
     {    
           if  (serial ==  null  )    
         {    
               try     
             {    
                   string  portname =  this  .txtPort.Text;    
                 SerialPortBaudRates rate  = (SerialPortBaudRates)Enum.Parse( typeof (SerialPortBaudRates),  this .txtBaudRate.Text); //  int.Parse(this.txtBaudRate.Text);     
                 SerialPortDatabits databit = (SerialPortDatabits) int .Parse( this  .txtDataBits.Text);    
                 Parity party  = (Parity)Enum.Parse( typeof (Parity),  this  .txtParity.Text);    
                 StopBits stopbit  = (StopBits)Enum.Parse( typeof (StopBits),  this  .txtStopBit.Text);    
   
                   //  使用枚举参数构造    
                   //  serial = new SerialPortUtil(portname, rate, party, databit, stopbit);    
                     
                   //  使用字符串参数构造     
                 serial =  new  SerialPortUtil(portname,  this .txtBaudRate.Text,  this .txtParity.Text,  this .txtDataBits.Text,  this  .txtStopBit.Text);    
                 serial.DataReceived  +=  new   DataReceivedEventHandler(serial_DataReceived);    
   
             }    
               catch   (Exception ex)    
             {    
                 MessageBox.Show(ex.Message);    
                 serial  =  null  ;    
                   return  ;    
             }    
         }    
   
           if  (! isOpened)    
         {                        
             serial.OpenPort();    
             btnConnect.Text  =  "  断开  "  ;    
         }    
           else     
         {    
             serial.ClosePort();    
             serial  =  null  ;    
   
             btnConnect.Text  =  "  连接  "  ;    
         }    
             
         isOpened  = ! isOpened;    
           this .btnSend.Enabled =  isOpened;    
           this .lblTips.Text = isOpened ?  "  已连接  "  :  "  未连接  "  ;    
     }    
       catch   (Exception ex)    
     {    
           this .lblTips.Text =  ex.Message;    
         MessageBox.Show(ex.Message);    
     }    
}   

4、POS打印机操作

本小节包括两个POS打印类,USB接口方式的POS小票打印的打印预览管理界面 FrmPosPrintPreview和基于并口接口方式的打印辅助类POSPrinter。

基于USB接口方式的POS小票打印该操作。很多基本上采用了GP5860这种POS打印机进行小票打印了。

执行打印预览,USB接口方式的小票可以实现效果的预览,如果是并口的只有直接输出,没有预览效果。

1)USB的POS打印的辅助类FrmPosPrintPreview提供了几个常用的参数进行配置,代码如下所示。

 ///   <summary>     
 ///   POS小票打印的打印预览管理界面    
  ///   </summary>     
 public   partial   class   FrmPosPrintPreview : Form    
{    
      ///   <summary>     
     ///   设置待打印的内容    
      ///   </summary>     
     public   string  PrintString =  ""  ;    
      ///   <summary>     
     ///   指定默认的小票打印机名称,用作快速POS打印    
      ///   </summary>     
     public   string  PrinterName =  "  GP-5860III  "  ;    
   
      ///   <summary>     
     ///   POS打印机的边距,默认为2    
      ///   </summary>     
     public   int  POSPageMargin =  2  ;    
   
      ///   <summary>     
     ///   POS打印机默认横向还是纵向,默认设置为纵向(false)    
      ///   </summary>     
     public   bool  Landscape =  false ;  

2)并口的POS打印辅助类POSPrinter提供了两个构造函数和一个打印操作,代码如下。

 ///   <summary>     
  ///   并口POS打印机操作辅助类    
   ///   </summary>     
  public   class   POSPrinter    
 {    
       ///   <summary>     
      ///   默认构造函数,打印并口名称为LPT1    
       ///   </summary>     
      public   POSPrinter()    
   
       ///   <summary>     
      ///   以指定的并口打印名称构造函数    
       ///   </summary>     
      ///   <param name="prnPort">  打印并口名称,如LPT1  </param>     
      public  POSPrinter( string   prnPort)    
   
       ///   <summary>     
      ///   打印内容    
       ///   </summary>     
      ///   <param name="str">  待打印的字符串  </param>     
      ///   <returns></returns>     
      public   string  PrintLine( string  str)  

3)辅助类的使用例子代码如下所示

 private   void  btnPosPrint_Click( object   sender, EventArgs e)    
{    
      if  ( this .lvwDetail.Items.Count ==  0  )    
    {    
        MessageUtil.ShowTips(  "  没有消费记录  "  );    
          return  ;    
    }    
   
    StringBuilder sb  =  new   StringBuilder();    
    sb.AppendFormat(  "  {0}\r\n\r\n  "  , Portal.gc.gAppUnit);    
    sb.AppendFormat(  "  客房消费\r\n  "  );    
    sb.AppendFormat(  "  结账单号:{0}\r\n  " ,  this  .lblCheckOutNo.Text);    
    sb.AppendFormat(  "  客户姓名:{0}\r\n  " ,  this  .txtName.Text);    
    sb.AppendFormat(  "  结账客房:{0}\r\n  "  , RoomInfo.RoomNo);    
    sb.AppendFormat(  "  打印时间:{0}\r\n\r\n  "  , DateTime.Now);    
   
    sb.AppendFormat(  "  项目     单价  数量  金额\r\n  "  );    
      for  ( int  i =  0 ; i < lvwDetail.Items.Count; i++ )    
    {    
        ListViewItem item  =  lvwDetail.Items[i];    
          string  itemName = item.SubItems[ 1  ].Text;    
          if  (itemName.Contains( "  买断消费  "  ))    
        {    
            itemName  =  "  买断消费  "  ;    
        }    
        sb.AppendFormat(  "  {0}  "  , itemName);    
        sb.AppendFormat(  "   {0}  " , item.SubItems[ 2  ].Text);    
        sb.AppendFormat(  "   {0}  " , item.SubItems[ 6  ].Text);    
        sb.AppendFormat(  "   {0}\r\n  " , item.SubItems[ 7  ].Text);    
    }    
    sb.AppendFormat(  "  \r\n\r  "  );    
    sb.AppendFormat(  "  总 金 额:{0}\r\n  " , Convert.ToDecimal( this .lblConsume.Tag).ToString( "  C2  "  ));    
    sb.AppendFormat(  "  实收金额:{0}\r\n  " , Convert.ToDecimal( this .txtAmount.Text).ToString( "  C2  "  ));    
    sb.AppendFormat(  "  实收大写:{0}\r\n  " , RMBUtil.CmycurD( this  .txtAmount.Text));    
    sb.AppendFormat(  "  现    金:{0}\r\n  " , Convert.ToDecimal( this .txtPay.Text).ToString( "  C2  "  ));    
    sb.AppendFormat(  "  找    零:{0}\r\n  " , Convert.ToDecimal( this .lblChange.Text).ToString( "  C2  "  ));    
    sb.AppendFormat(  "  \r\n\r  "  );    
   
    Portal.gc.PosPrint(sb.ToString());    
}   

 ///   <summary>     
 ///   提供通用的POS打印函数    
  ///   </summary>     
 public   void  PosPrint( string   printString)    
{    
      bool  useUSB =  SystemConfig.Default.IsUSBPOSPrinter;    
      if  (! useUSB)    
    {    
          if  (MessageUtil.ShowYesNoAndTips( "  您是否确定进行POS打印?  " ) ==  DialogResult.No)    
        {    
              return  ;    
        }    
        POSPrinter print  =  new   POSPrinter(SystemConfig.Default.PosPrintPort);    
          string  error =  print.PrintLine(printString);    
          if  (error !=  ""  )    
        {    
            MessageUtil.ShowError(error);    
        }    
    }    
      else     
    {    
        FrmPosPrintPreview dlg  =  new   FrmPosPrintPreview();    
        printString  =  "  \r\n\r\n\r\n\r\n  "  +  printString;    
        printString  +=  string .Format( "  \r\n签单金额:\r\n  "  );    
        printString  +=  string .Format( "  \r\n签单单位:\r\n  "  );    
        printString  +=  string .Format( "  \r\n签 单 人:\r\n  "  );    
        dlg.PrintString  =  printString;    
        dlg.ShowDialog();    
    }    
}   

5、玻璃效果图片按钮控件 VistaButton

本辅助类主要是用来方便实现美观的图片按钮,类似玻璃效果的那种,图片放上去可以带有动态阴影效果。 这个是一个Vista样式的控件,其代码是在Codeproject上有的: http://www.codeproject.com/KB/buttons/VistaButton.aspx 

通过改变其颜色,就可以实现不同的效果,而且鼠标靠近或者离开都有特殊的效果,比较酷。例如我加上颜色图片后,得到的效果如下所示:

 

使用说明:

在VS工具箱里面添加该共用类库的程序集应用,然后添加VistaButton控件的使用即可。
可以在窗体的可视化设计界面中,编辑控件的背景色等图片效果,实现更多美妙的特效。
该控件属于界面控件,直接拖动到界面即可使用。

6、TreeView的包装类,实现树的DragDrop拖拉的操作的辅助类 TreeViewDrager 

1)辅助类提供的方法接口如下所示:

 public   class   TreeViewDrager    
{    
      ///   <summary>     
     ///   设置拖动树的时候,显示的图片,显示其中第一个    
      ///   </summary>     
     public   ImageList TreeImageList    
   
      ///   <summary>     
     ///   默认构造函数    
      ///   </summary>     
     public   TreeViewDrager()    
   
      ///   <summary>     
     ///   参数构造函数,设置操作的TreeView    
      ///   </summary>     
     ///   <param name="treeView"></param>     
     public   TreeViewDrager(TreeView treeView)    
   
      ///   <summary>     
     ///   处理拖动节点后的事件    
      ///   </summary>     
     public   event   ProcessDragNodeEventHandler ProcessDragNode;    
}   

2)辅助类的使用例子代码如下所示

 private   void   Init()    
{    
    TreeViewDrager treeViewDrager  =  new  TreeViewDrager( this  .treeView1);    
    treeViewDrager.TreeImageList  =  this .imageList1; //  不设置这个也可以,只是拖动的时候没图标。     
    treeViewDrager.ProcessDragNode +=  new   ProcessDragNodeEventHandler(treeViewDrager_ProcessDragNode);    
}    
   
  private   bool  treeViewDrager_ProcessDragNode(TreeNode  from  , TreeNode to)    
{    
      //  这里根据from/to两个节点记录的信息去进行数据库持久化的工作。    
      //  根据持久化的结果决定节点是否会最终实现拖动操作。     
     return   true  ;    
}   

实际上,我们需要处理拖动后的事件,一般来说,我们需要调整他们的父目录就可以了,如我的通用字典管理模块,就是利用这个控件实现拖动效果。

 public   FrmDictionary()    
{    
    InitializeComponent();    
   
    TreeViewDrager drager  =  new  TreeViewDrager( this  .treeView1);    
    drager.TreeImageList  =  this  .imageList1;    
    drager.ProcessDragNode  +=  new   ProcessDragNodeEventHandler(drager_ProcessDragNode);    
}    
   
  bool   drager_ProcessDragNode(TreeNode dragNode, TreeNode dropNode)    
{    
      if  (dragNode !=  null  && dragNode.Text ==  "  数据字典管理  "  )    
          return   false  ;    
   
      if  (dropNode !=  null  && dropNode.Tag !=  null  )    
    {    
          string  dropTypeId =  dropNode.Tag.ToString();    
          string  dragTypeId =  dragNode.Tag.ToString();    
          //  MessageUtil.ShowTips(string.Format("dropTypeId:{0} dragTypeId:{1}", dropTypeId, drageTypeId));     
   
         try     
        {    
            DictTypeInfo dragTypeInfo  = BLLFactory<DictType> .Instance.FindByID(dragTypeId);    
              if  (dragTypeInfo !=  null  )    
            {    
                dragTypeInfo.PID  =  dropTypeId;    
                BLLFactory <DictType> .Instance.Update(dragTypeInfo, dragTypeInfo.ID);    
            }    
        }    
          catch   (Exception ex)    
        {    
            LogHelper.Error(ex);    
            MessageUtil.ShowError(ex.Message);    
              return   false  ;    
        }    
    }    
      return   true  ;    
}   

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于 Winform开发框架 、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪   http://www.iqidi.com  
    

 

 

标签:  公用类库使用帮助

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Winform开发的常用类库的详细内容...

  阅读:35次