.NET C/S(WinForm)开发技巧点滴

     花费了十天时间,为公司开发了一套简单的网络版的信息管理系统,功能主要有客户信息管理,员工信息管理,常用信息管理(各种信函打印、常用网址/常用电话等),公司简单的财务管理等。把一些点点滴滴的技巧在此记录下来,以备查用。

1.数据绑定。 DataReader 读取数据,用DataTable.Load(IDataReader)方法将数据加载到 DataTable ,用DataGridView 显示输出。不要把DataGridView直接绑定到DataReader的目的是数据导出到Excel时,数据源可以再次从DataGridView获得。
不要在 DataGridView 内编辑添加数据,因为数据类型检查不严格(或要严格检查类型需要花费更大的成本)。

2.数据导出到 Excel 。代码如下:

/// <summary>
/// 
/// ** DataTable 数据导出到 Excel **
///
///  Author: 周振兴 (Zxjay 飘遥)
/// 
///  E-Mail: tda7264@163.com
/// 
///  Blog: http://blog.csdn.net/zxjay
/// 
///  Date: 07-08-31
/// 
/// </summary>

                Excel.Application app  =   new  Excel.Application();
                app.Visible 
=   false ;
                Excel.Workbook wb 
=  app.Workbooks.Add( true );
                Excel.Worksheet ws 
=  (Excel.Worksheet)wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, 

Type.Missing);

                DataTable dt 
=  (DataTable)dgvClientInfo.DataSource;

                
for  ( int  i  =   0 ; i  <  dt.Columns.Count; i ++ )
                
{
                    ws.Cells[
1, i + 1= dt.Columns[i].ColumnName;
                }


                
for  ( int  j  =   0 ; j  <  dt.Rows.Count; j ++ )
                
{
                    
for (int k = 0; k < dt.Columns.Count; k++)
                    
{
                        ws.Cells[j 
+ 2, k + 1= dt.Rows[j][k];
                    }

                }

                app.Visible 
=   true ;

注意:Excel的Cells[,]下标是从1,1开始的,而不是0,0。

3.防止子窗口重复打开,确保某一子窗口只打开一次。代码为:

             foreach  (Form frm  in   this .MdiChildren)
            
{
                
if (frm is WorkerList)
                
{
                    frm.WindowState 
= FormWindowState.Normal;
                    frm.Activate();
                    
return;
                }

            }


            WorkerList wl 
=   new  WorkerList();
            wl.MdiParent 
=   this ;
            wl.Show();

4.使用枚举 enum 区分类同信息。

硬编码方式容易造成混乱。如本系统的常用电话/常用网址,数据项都为:名称-内容-备注,可将它们保存在同一个表中,在程序中为区分信息类型,可定义以下枚举:

     public   enum  TelWeb
    
{
        Telephone,WebSite
    }

5.在ToolStrip中加入其它WinForm控件。

如在ToolStrip中加入DateTimePicker。如图:.

            DateTimePicker dt1  =   new  DateTimePicker();
            dt1.Width 
=   110 ;
            ToolStripControlHost host1 
=   new  ToolStripControlHost(dt1);
            host1.Alignment 
=  ToolStripItemAlignment.Right;
            toolStrip1.Items.Insert(
10 , host1);

6.用微软的可打印的富文本框控件打印带格式的文本。

与.NETFX自带的RichTextBox相比只增强了打印功能。通过该控件,可设置文本字体、颜色、对齐方式、粘贴图片,可打印看上去很专业的文档,截图如下:

.

7.保存富文本格式到数据库。

以二进制格式保存。保存的代码为:

            MemoryStream ms  =   new  MemoryStream();
            rtbContent.SaveFile(ms, RichTextBoxStreamType.RichText);
            
byte [] bt = ms.ToArray();  // 将bt保存到数据库

读取的代码为:

             byte [] bt  =  ( byte [])SqlHelper.ExecuteScalar(sqlStr,  null );
            MemoryStream ms 
=   new  MemoryStream(bt,  false );
            rtbContent.LoadFile(ms, RichTextBoxStreamType.RichText);

在SQLServer中对应的数据类型为:image

8.管理员权限控制。

管理员信息表中权限字段保存一个字符串,拥有该项权限则在字符串相应位置保存为1,没有该项权限为0。在管理员登录时判断权限,启用或禁用相应的菜单项。

9.信息分类。

如客户分类分为:软件客户、网站客户、合作客户等。如果数据量不是太大,可不用单独建立分类表,在添加的时候,客户类型。可用ComboBox,在Form加载时检索数据库中已有的客户类型填充到ComboBox中。这样可选择已有客户类型,也可以添加新的客户类型。

10.数据库安装。

不必集成在安装包中,可单独写一个WinForm程序来收集连接服务器的信息(服务器地址、数据库名、用户名、密码等),并执行数据库生成的脚本来建立数据表,视图,存储过程、索引等。
读取保存数据库脚本文件的代码:

         public   static   string  ReadDBScript( string  fileName)
        
{
            StreamReader sr 
= new StreamReader(fileName);
            
return sr.ReadToEnd();
        }

注意:数据库生成的脚本必须把"GO"去掉,否则执行时报错。

11.安全控制。

由于是网络版系统,因而安全性要考虑周全。数据库连接字符串加密保存在配置文件中。为了防止软件XCopy到其它机器中,可以取机器的硬件(如硬盘、网卡、CPU)序列号的一部分再加上自己的私有密钥作为连接字符串的加密密钥(八位ASCII),确保密钥的私密性、每机器唯一性。

(1)取得机器CPU的ID的前八位作为密钥:

         public   static   string  GetProcessID()
        
{
            
try
            
{
                
string str = string.Empty;
                ManagementClass mcCpu 
= new ManagementClass("win32_Processor");
                ManagementObjectCollection mocCpu 
= mcCpu.GetInstances();

                
foreach (ManagementObject m in mocCpu)
                
{
                    str 
= m["ProcessorId"].ToString().Trim().Substring(08);
                }

                
return str;
            }

            
catch (Exception ex)
            
{
                
return "zhenxing"//如果失败取默认的密钥
            }

        }

 (2)加密算法:

         public   static   string  Encode( string  data)
        
{
            
byte[] aKey = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
            
byte[] aIV = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());

            DESCryptoServiceProvider cp 
= new DESCryptoServiceProvider();
            MemoryStream ms 
= new MemoryStream();
            CryptoStream cs 
= new CryptoStream(ms, cp.CreateEncryptor(aKey, aIV), CryptoStreamMode.Write);
            StreamWriter sw 
= new StreamWriter(cs);

            sw.Write(data);
            sw.Flush();
            cs.FlushFinalBlock();
            sw.Flush();
            
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        }

 (3)解密算法:

         public   static   string  Decode( string  data)
        
{
            
byte[] aKey = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
            
byte[] aIV = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());

            
byte[] Enc;
            
try
            
{
                Enc 
= Convert.FromBase64String(data);
            }

            
catch
            
{
                
return null;
            }


            DESCryptoServiceProvider cp 
= new DESCryptoServiceProvider();
            MemoryStream ms 
= new MemoryStream(Enc);
            CryptoStream cs 
= new CryptoStream(ms, cp.CreateDecryptor(aKey, aIV), CryptoStreamMode.Read);
            StreamReader sr 
= new StreamReader(cs);
            
return sr.ReadToEnd();
        }

 (4)数据库连接字符串保存到配置文件:

         public   static   void  SaveToConfig( string  connStr)
        
{
            XmlDocument doc 
= new XmlDocument();
            
string fn = "zxjay.exe.config";

            doc.Load(fn);

            XmlNodeList nodes 
= doc.GetElementsByTagName("add");

            
for (int i = 0; i < nodes.Count; i++)
            
{
                XmlAttribute att 
= nodes[i].Attributes["key"];
                
if (att.Value == "SQLConectionString")
                
{
                    att 
= nodes[i].Attributes["value"];
                    att.Value 
= connStr;
                    
break;
                }

            }

            doc.Save(fn);
        }

 

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
文档,原程序,安装程序,模型等很齐全 connie’s store系统软件需求说明书 1 引言   随着信息产业的出现和网络的普及,计算机的应用已普及到人类社会的每一个角落,它与人类的生活关系越来越密切。超市在我们的生活中充当了相当重要的角色,使超市的销售信息化自动化是当前超市系统所面临的一大难题。通过connie’s store系统软件,会使收银员更方便,更快捷的销售,从而提高工作效率.,使顾客更快捷地获得商品。 1.1 编写目的   a. 本说明的编写目的在于研究connie’s store系统软件在技术方面的具体需求,指出实现本软件功能的方法与途径。为后来的设计工作做好充分准备。   b. 本软件的预期读者是周炎晖老师及课题开发小组。  1.2 背景及范围   a. 本项目的名称为connie’s store系统的开发。   b. 本产品能帮助收银员更快地完成一次销售,并能使我们了解vb程序设计语言的优越性。   c. 本connie’s store系统软件的应用   本软件使用户了解了vb程序设计语言的优越性,其扩展性,可移植性和伸缩性都很强,能在已有的基础上不断完善。  1.3 定义术语   a. vb程序设计语言   是一种通用的计算机程序设计语言。   b. connie’s store系统软件   为了帮助收银员尽快熟悉销售从而达到更快地完成销售的目的而开发的销售软件。  1.4 参考资料     <>        <> <>  2 项目概述   市场上的connie’s store系统软件已具有比较完善的技术,但本软件采用了具有创新思维的vb程序设计语言,它将复杂的程序设计语言简单化,直观化,是一种通用的计算机程序设计语言。通过开展此工程,培养我们的团体协作意识和软件工程思想,同时在程序设计上也得到锻炼和提高。 2.1目标   2.1.1 开发意图 通过将信息放入数据库,实现调用数据库,实现vb编程与数据库的互动。使我们近一步掌握程序设计语言开发软件技术,培养我们的软件工程设计思想。 2.1.2 应用目标   connie’s store系统软件能使收银员快速的熟悉整个销售过程提高效率。同时通过本软件对vb编程语言作更进一步的推广。   2.1.3 作用及范围 本connie’s store系统软件适用于中小型的超市。 2.1.4 背景   本产品是采用vb程序设计语言开发,在WINDOWS环境下运行的软件。  2.2 产品描述   本产品是一项基于vb编程的产品,是以vb编程技术为核心,用vb程序设计语言进行开发的产品。   2.2.1 相关关系   本产品为独立软件,全部内容自含.  2.3 产品功能   2.3.1 内部功能   本软件的内部功能主要为实现了vb程序设计语言与数据库的结合,以及部分API函数的调用。   2.3.2 外部功能 本软件具有外部功能包括以下几个内容: (1)销售管理:对超市的整个销售过程进行管理,包括收银员的登陆,商品的信息输入,商品的出售,以及购买信息的输出和销售信息的入库。 (2)退货管理:对顾客购买的损坏货物的退还处理,包括退还货物信息的输入,对货物信息的核对以及货物的入库。 (3)收银员登陆:收银员用自己获得的帐号和密码登陆系统。  2.3.3 功能描述表 收银员用自己获得的帐号和密码登陆系统,系统随即调用数据库检查其有效性,若正确则进入销售页面进行商品销售.当用户购买商品时收银员通过扫描商品键入信息并调用数据库进行一次销售,当一次销售完毕收银员按键将进入下一次销售.其另一个功能是当商品出现问题时,客户凭小票退还商品,收银员将把退还的商品调入数据库的相应的表中. 2.4 用户特点 一般的小型超市收银员。   1. 要求对微软Windows界面比较熟悉,能熟悉上网基本操作。 2. 为了确保客户和酒店的信息具有更好的安全性,前台管理和后台管理是分离的。前台的管理模块需要经过权限授权才可以使用,我们为此设计了的收银员角色必须能进入系统的帐号和密码。至于帐号和密码的获得得从超市系统的另一个子系统获得,在这里我们做了一定的假设  2.5假定和约束 假定系统输入商品是在实际中是通过扫描进去的.假定后台的管理系统已经存在并且已经在数据库中添加了一定的收银员。 约束:计算机配置486以上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值