C# winform项目开发规范

  •  前言

        虽然用C# winform开发项目有段时间了,但之前没系统学过,也没人指导,平时做项目都是从需求出发,学习对应的知识。老师给的评价是:虽然功能都能实现,但还欠点火候。最近给审计局的学长做个审计管理系统,需求其实和通常的成绩管理系统很相似,就在网上下载了个成绩管理系统作为参考(网址:https://github.com/soulsjie/StuScoreMa)。这个系统,虽然内容上没什么新意,但是形式上特别规范,让我有种拍案而起的冲动:原来可以这样。做完我的系统后,觉得有几点很值得和刚接触C# winform开发的同学分享分享。

  • 创建文件夹

        根据项目文件的类型创建文件夹,每个文件夹中放入同一类型的文件。添加文件时,右键文件夹,选择添加新项。这样做的好处是为了更方便的找到你想要的文件,小项目可能体现不出来效果,毕竟也没几个文件,但是对一些大的项目开发是必不可少的。而且也提高了代码的可读性,其他人通过看目录,能初步了解系统的结构。

        定义了一个文件夹,相当于定义了一个命名空间。比如我在main.cs代码界面中调用工具类文件夹下的DBliink类,因为不在一个文件夹里,所以要在代码首部添加引用。

using Audit.工具类;
  • 封装操作类

         C# winform开发是一种事件驱动型模型,所以你在开发时会发现主窗体的代码量会越来越多,因为它是所有事件的起点。代码量一多,就容易混乱,特别是以前我把事件和方法操作混在一起的时候。通过加注释和关键字#region,效果不明显,治标不治本。错的最离谱的一点是, 这样做根本不能体现C#面向对象的优越性,这可能和我习惯了C有关。下面我给出 mysql操作类,帮助大家了解C#面向对象的精彩。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MySql.Data.MySqlClient;
using System.Windows.Forms;   //引入Messagebox
using Audit.数据实体类;

namespace Audit.工具类
{
    //将数据库连接功能,单独定义为一个类来执行
    class DBlink
    {
        MySqlConnection sqlCnn = new MySqlConnection(); //创建数据库连接对象
        MySqlCommand sqlCmd = new MySqlCommand();       //创建执行sql的对象
     
        //创建数据连接
        public Boolean DBcon()
        {
            Boolean tag = false;
            sqlCnn.ConnectionString = "server = '127.0.0.1'; uid = 'root'; pwd = 'root'; database = 'audit_project';";//连接字符串
            sqlCmd.Connection = sqlCnn;
            try
            {
                sqlCnn.Open();
                tag = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "error");
            }
            return tag;
        }

        //关闭数据库连接
        public void DBclose()
        {
            sqlCnn.Close();
            //Console.WriteLine("数据库连接关闭");
            //Console.ReadKey();
        }

       
        //执行查询的sql
        public Boolean search(String str)
        {
            Boolean tag = false;
            sqlCmd.CommandText = str;
            MySqlDataReader rec = sqlCmd.ExecuteReader();//创建结果集
            if (rec.HasRows)
            {
                tag  = true;     // 查询到数据
            }
            return tag;
        }

        //执行增删改的sql
        public Boolean UpdataDeletAdd(string str)
        {
            sqlCmd.CommandText = str;
            return sqlCmd.ExecuteNonQuery() > 0;
        }

        //定义自定义函数方法,在dataGridView中显示单位的审计情况       
        public void Get_dataGridView1_data(string str)
        {
            sqlCmd.CommandText = str;
            MySqlDataReader rec = sqlCmd.ExecuteReader();
            //初始化数据;
            uint_data.id.Clear();
            uint_data.unit.Clear();
            uint_data.tf_audit.Clear();
            while (rec.Read())
            {
                uint_data.id.Add(rec.GetString(0));
                uint_data.unit.Add(rec.GetString(1));
                uint_data.tf_audit.Add(rec.GetString(2));
            }
        } 
}  

        在窗体中,通过声明类的对象,来调用类中的方法,将事件和操作完全分开,主窗体中只有各种事件。

if (db.DBcon())   //连接数据库成功
{
      if (!db.UpdataDeletAdd(str)) 
      {
            DialogResult dr = MessageBox.Show("删除失败", "标题", MessageBoxButtons.OK, MessageBoxIcon.Question);
      }
}
db.DBclose();  //避免多线程操作数据库,影响系统报错,先关闭数据连接
  • 封装数据类

        有一些重要的变量会涉及到好几个窗体,比如成绩管理系统中用户的登录名。我以前的做法是,在主窗体中定义该变量为静态变量,然后在子窗体中通过主窗体名直接点出来,或者是通过构造函数传递参数。其实这些方法都是可行的,完全不会影响编译,但是的确不过规范,会让主窗体中定义的变量过多,容易混淆。下面以用户登录信息的数据实体为例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; 

namespace dataADUstudy.数据实体类
{
    class LoginInfo
    {
        //保存用户登录信息的数据实体
        public static string username;  //用户名
        public static string password;  //密码
        public static int tag;          //审核标记
        public static string sf;        //身份标记
        public static string number;    //学号--学生信息表中的主键
        public static string banji;     //班级
        public static Boolean isadmin=false;      //管理员标记

        //创建list存储查询的用户信息结果集(个人特别喜欢用动态数据,操作非常方便)
        public static ArrayList idList = new ArrayList();        //用户id
        public static ArrayList usernameList = new ArrayList();  //用户名
        public static ArrayList passwordList = new ArrayList();  //登录密码
        public static ArrayList SfList = new ArrayList();        //用户身份
        public static ArrayList numberList = new ArrayList();    //用户编号
        public static ArrayList banjiList = new ArrayList();     //所属班级
    }
}

// 通过类名调用数据
// LoginInfo.username = rec.GetString(1);  //将用户名存放到数据实体类
  • 总结

         说了这么多,其实就是为了一个目的,就是为了减少主窗体的代码量,只留下事件。这几条规范也只是我的有感而发吧,这个命题还是很大的,欢迎大神指点。另外,我的审计管理系统也已经上传了,欢迎下载。https://download.csdn.net/download/langwen2048/10817236

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值