C# .net Framework Windows窗体应用【02】

本文代码仓库地址:gitee码云CSDN笔记仓库地址



数据库


一、资源管理器的内容

在这里插入图片描述


二、项目 WindowsFormsApp_xiaoyin01 下的文件内容

在放窗体的项目中应用下面两个项目
右键【引用】–【添加引用】–【项目】-- 勾选引用的项目后【确定】

1.Common 下的 FormFactory_xy.cs 类文件

using DevExpress.Utils.VisualEffects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp_xiaoyin01.Common {
    
    

  /// <summary>
  /// 泛型缓存:是同一个类,当泛型的数据类型不同时,系统会默认它是两个不同的类,当程序运行时相同的只会运行一次
  /// </summary>
  /// <typeparam name="T">泛型的数据类型</typeparam>
  // public class FormFactory_xy<T> {
    
    
  public class FormFactory_xy {
    
    
    //private static FrmUserManager_xy FrmUserManager;
    //private static FrmBaseManager_xy FrmBaseManager;
    //private static FrmNone_xy FrmNone;
    // private static Form form;
    private static List<Form> forms = new List<Form>();

    //public static Form CreatForm(int index)
    //{
    
    
    //  HideFormAll();
    //  switch (index)
    //  {
    
    
    //    case 0:
    //      if (FrmUserManager == null)
    //      {
    
    
    //        // 实例化 FrmUserManager_xy
    //        FrmUserManager = new FrmUserManager_xy();
    //        // 新建 form 添加到 List 集合中
    //        forms.Add(FrmUserManager);
    //      }
    //      // 窗体赋给父窗体
    //      form = FrmUserManager;
    //      break;
    //    case 1:
    //      if (FrmBaseManager == null)
    //      {
    
    
    //        // 实例化 FrmBaseManager_xy
    //        FrmBaseManager = new FrmBaseManager_xy();
    //        // 新建 form 添加到 List 集合中
    //        forms.Add(FrmBaseManager);
    //      }
    //      // 窗体赋给父窗体
    //      form = FrmBaseManager;
    //      break;
    //    default:
    //      if (FrmNone == null)
    //      {
    
    
    //        // 实例化 FrmBaseManager_xy
    //        FrmNone = new FrmNone_xy();
    //        // 新建 form 添加到 List 集合中
    //        forms.Add(FrmNone);
    //      }
    //      // 窗体赋给父窗体
    //      form = FrmNone;
    //      break;
    //  }
    //  return form;
    //}

    // 缓存
    private static List<Type> types;
    /// <summary>
    /// 静态构造方法
    /// </summary>
    static FormFactory_xy()
    {
    
    
      // 泛型缓存后 不用一次一次的进行反射,进而降低程序的开销,提升性能
      Assembly ass = Assembly.LoadFrom("WindowsFormsApp_xiaoyin01.exe");
      types = ass.GetTypes().ToList();
    }

    // 静态先加载
    public static Form CreatForm(string formName)
    {
    
    
      // 反射程序集
      // Assembly ass = Assembly.Load("WindowsFormsApp_xiaoyin01");
      // 获取程序的根目录
      // string path = AppDomain.CurrentDomain.BaseDirectory;
      // 三种加载程序集的方式【反射】
      // Assembly ass = Assembly.LoadFile(path + "WindowsFormsApp_xiaoyin01.exe"); // 写法一
      // Assembly ass = Assembly.LoadFrom("WindowsFormsApp_xiaoyin01.exe"); // 写法二【 LoadFrom 默认的是根目录】
      // Assembly ass = Assembly.LoadFile($"{path}WindowsFormsApp_xiaoyin01.exe"); //写法三
      // 获取程序集内所有的类 【为了防止命名不规范出现窗体与其他类名相同,可以使用 GetTypes().Where(m => m.BaseType == typeof(Form)).ToArray() 进行判断】
      // List<Type> types = ass.GetTypes().ToList();
      HideFormAll();
      // Type type = types.Find(m => m.Name == formName);

      // 如果 formName 为空 就显示 FrmNone_xy ,如果不为空,就正常显示 formName【这样讲留穿空窗体过来也可以不报错】
      // 因为我的 tag 编辑过后删除的,所以这里如果直接是没有编辑过 tag 这样写报错可以试试 == null
      formName = formName == "" ? "FrmNone_xy" : formName;

      Form form = forms.Find(m => m.Name == formName);
      if (form == null)
      {
    
    
        Type type = types.Find(m => m.Name == formName);
        // type 实例化
        form = (Form)Activator.CreateInstance(type);
        forms.Add(form);
      }

      // // type 实例化
      // Form form = (Form)Activator.CreateInstance(type);
      // forms.Add(form);
      return form;
    }

    public static void HideFormAll()
    {
    
    
      // FrmUserManager?.Hide();
      // FrmBaseManager?.Hide();
      foreach (var fm in forms)
      {
    
    
        // 隐藏集合中所有的窗体
        fm.Hide();
      }
    }

  }
}

2.App.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<connectionStrings>
		<!-- 添加一个节点 connectionStrings:连接字符串   Data Source:数据库ip,database:数据库名称,uid:数据库账号,pwd:数据库密码 -->
		<add name="ConStr" connectionString="Data Source=127.0.0.1; database=yin; uid=sa; pwd=YINhui1998"/>
	</connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

3.FrmBaseManager_xy.cs 窗体文件

控件:dataGridViewpanel在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Models;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  public partial class FrmBaseManager_xy : Form {
    
    
    public FrmBaseManager_xy()
    {
    
    
      InitializeComponent();
    }

    private void FrmBaseManager_xy_Load(object sender, EventArgs e)
    {
    
    
      dataGridView1.DataSource = AppraisalBases_xy.ListAll();
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
    
    
      // 直接在表格里面修改数据,不建议使用,这里是为了记录有这么一种方法
      AppraisalBases_xy AppraisalBases = (AppraisalBases_xy)dataGridView1.Rows[e.RowIndex].DataBoundItem;
      AppraisalBases_xy.Updata(AppraisalBases);
      MessageBox.Show("数据已修改!");
    }
  }
}

在这里插入图片描述

4.FrmMain_xy 窗体文件

控件:splitContainertreeView
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Common;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  public partial class FrmMain_xy : Form {
    
    

    // FrmUserManager_xy FrmUserManager;
    // FrmBaseManager_xy FrmBaseManager;

    public FrmMain_xy()
    {
    
    
      InitializeComponent();
    }

    private void FrmMain_xy_Load(object sender, EventArgs e)
    {
    
    
      // Form form = FormFactory_xy<int>.CreatForm("FrmUserManager_xy");
      Form form = FormFactory_xy.CreatForm("FrmUserManager_xy");

      /* FrmMain_xy 窗体属性设置
       * isMdiContainer: True; 是设置为可以承载子窗体的一个父窗体
       */

      /*
      FrmUserManager = new FrmUserManager_xy();
      // 他的 父MDI 为当前这个窗体
      FrmUserManager.MdiParent = this;
      // 他的父容器为 splitContainer1.Panel2
      FrmUserManager.Parent = splitContainer1.Panel2;
      // 显示在这个窗体容器中不能用 ShowDialog
      FrmUserManager.Show();
      */

      // Form form = FormFactory_xy.CreatForm(0);

      // 他的 父MDI 为当前这个窗体
      form.MdiParent = this;
      // 他的父容器为 splitContainer1.Panel2
      form.Parent = splitContainer1.Panel2;
      form.Show();

      // 模式显示窗体 FrmUserManager_xy(在窗体以外显示)
      // FrmUserManager.ShowDialog();
      // 设置 treeView1 的角标为 0 的节点的行颜色
      treeView1.Nodes[0].BackColor = SystemColors.Highlight;
      treeView1.Nodes[0].ForeColor = Color.White;
    }

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
    
    
      // 选择了某项后出发的事件
      // 每次选择节点前恢复之前的默认设置
      foreach (TreeNode node in treeView1.Nodes)
      {
    
    
        node.BackColor = Color.White;
        node.ForeColor = Color.Black;
      }
      // 设置选择的节点背景颜色为系统色高亮
      e.Node.BackColor = SystemColors.Highlight;
      // 设置前景色为白色
      e.Node.ForeColor = Color.White;

      //switch (e.Node.Index)
      //{
    
    
      //  case 0:
      //    if (FrmUserManager == null)
      //    {
    
    
      //      FrmUserManager = new FrmUserManager_xy();
      //    }
      //    // 他的 父MDI 为当前这个窗体
      //    FrmUserManager.MdiParent = this;
      //    // 他的父容器为 splitContainer1.Panel2
      //    FrmUserManager.Parent = splitContainer1.Panel2;
      //    // 隐藏下面的 技术管理页面【加一个 ? 表示,如果不为空就执行后面的 .Hide()】
      //    // 等同于 if (frmBaseManager != null) frmBaseManager.Hide();
      //    FrmBaseManager?.Hide();
      //    // 显示在这个窗体容器中不能用 ShowDialog
      //    FrmUserManager.Show();
      //    break;
      //  case 1:
      //    if (FrmBaseManager == null)
      //    {
    
    
      //      FrmBaseManager = new FrmBaseManager_xy();
      //    }
      //    // 他的 父MDI 为当前这个窗体
      //    FrmBaseManager.MdiParent = this;
      //    // 他的父容器为 splitContainer1.Panel2
      //    FrmBaseManager.Parent = splitContainer1.Panel2;
      //    // 隐藏上面的用户管理窗体
      //    FrmUserManager.Hide();
      //    FrmBaseManager.Show();
      //    break;
      //  default:
      //    break;
      //}

      // Form form = FormFactory_xy.CreatForm(e.Node.Index);
      //Form form = FormFactory_xy<int>.CreatForm(e.Node.Tag.ToString());
      Form form = FormFactory_xy.CreatForm(e.Node.Tag?.ToString());
      // 他的 父MDI 为当前这个窗体
      form.MdiParent = this;
      // 他的父容器为 splitContainer1.Panel2
      form.Parent = splitContainer1.Panel2;
      form.Show();

    }
  }
}

在这里插入图片描述

5.FrmNone_xy.cs 窗体文件

这个里面是空的窗体,因为【系数管理】没有做,这个是放在没有做的内容里面的

6.FrmSetUser_xy.cs 窗体文件

控件:groupBox*2、textBox*2、comboBox*2、checkBox
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Models;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  public partial class FrmSetUser_xy : Form {
    
    

    private DelBindDgv _delBindDgv;

    public FrmSetUser_xy(DelBindDgv delBindDgv)
    {
    
    
      InitializeComponent();
      _delBindDgv = delBindDgv;
    }

    private Users_xy _user;
    public FrmSetUser_xy(DelBindDgv delBindDgv, int userId):this(delBindDgv)
    {
    
    
      // 方法重载【方法名可以一样,参数的数量和类型不同就可以】
      // 初始化组件。也可以使用上面的 :this(delBindDgv) ,会调用上面的方法,可以 Ctrl+鼠标左键看指向
      // InitializeComponent();
      _user = Users_xy.ListAll().Find(m => m.Id == userId);

    }

    // FormBorderStyle: FixedToolWindow; 设置窗体样式
    private void FrmSetUser_Load(object sender, EventArgs e)
    {
    
    
      List<AppraisalBases_xy> AppraisalBases = new List<AppraisalBases_xy>();
      AppraisalBases = AppraisalBases_xy.ListAll();
      comboBox1.DataSource = AppraisalBases;
      // 显示的正常的数据【显示值】
      comboBox1.DisplayMember = "BaseType";
      // 数据表里面的数据有关联的【真实值】
      comboBox1.ValueMember = "id";
      if (_user != null)
      {
    
    
        textBox2.Text = _user.Id.ToString();
        textBox1.Text = _user.UserName;
        comboBox1.SelectedValue = _user.BaseTypeld;
        comboBox2.Text = _user.Sex;
        checkBox1.Checked = _user.IsDel;
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
    
    
      int a;
      try
      {
    
    
        a = int.Parse(textBox2.Text);
      }
      catch
      {
    
    
        a = 0;
      }

      string userName = textBox1.Text.Trim();
      int BaseTypeId = (int)comboBox1.SelectedValue;
      string sex = comboBox2.Text;
      // 有没有选中
      bool isDel = checkBox1.Checked;
      
      if (_user == null)
      {
    
    
        Users_xy user = new Users_xy
        {
    
    
          Id = a,
          UserName = userName,
          Sex = sex,
          PassWord = "666",
          BaseTypeld = BaseTypeId,
          IsDel = isDel
        };
        Users_xy.Insert(user);
        MessageBox.Show("添加成功!");
      }
      else
      {
    
    
        //_user.Id = int.Parse(comboBox2.Text);
        _user.UserName = userName;
        _user.Sex = sex;
        _user.PassWord = "6666666";
        _user.BaseTypeld = BaseTypeId;
        _user.IsDel = isDel;
        Users_xy.Updata(_user);
        MessageBox.Show("修改成功!");
      }

      // 通过委托直接刷新外面的表格
      _delBindDgv();
      this.Close();
    }

  }
}

在这里插入图片描述

7.FrmUserAppraisal_xy.cs 窗体文件

控件:groupBoxdataGridViewcomboBoxlabelcontextMenuStrip
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Models;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  public partial class FrmUserAppraisal_xy : Form {
    
    
    public FrmUserAppraisal_xy()
    {
    
    
      InitializeComponent();
      /* dataGridView1
       * 设置为整行选中 -- dataGridView1.SelectionMode = FullRowSelect;
       * 关闭多行选中 -- dataGridView1.MultiSelect = false;
       * 绑定菜单控件 -- dataGridView1.ContextMenuStrip = contextMenuStrip1;
       */
    }

    Action bindDgv_xy;

    private void FrmUserAppraisal_xy_Load(object sender, EventArgs e)
    {
    
    
      SetCol();
      BindDgvUserAppraisal();
      // 方法赋值给变量
      bindDgv_xy = BindDgvUserAppraisal;
    }

    /// <summary>
    /// 类似刷新
    /// </summary>
    private void BindDgvUserAppraisal()
    {
    
    
      // 获取需要扩展的表
      DataTable dtUser = UserAppraisalBases_xy.GetListDtJoinAppraisal();
      // 获取系数表集合
      List<AppraisalCoefficients_xy> AppraisalCoefficients = AppraisalCoefficients_xy.ListAll();
      // 把 AppraisalCoefficients 里面的内容动态扩展到 dtUser 的列里面【通过系数表填充 dtUser】
      foreach (var item in AppraisalCoefficients)
      {
    
    
        // 添加系数名
        dtUser.Columns.Add(new DataColumn
        {
    
    
          ColumnName = "AppraisalType" + item.Id
        });
        // 添加系数值
        dtUser.Columns.Add(new DataColumn
        {
    
    
          ColumnName = "AppraisalCoefficient" + item.Id
        });
        // 添加计算方式
        dtUser.Columns.Add(new DataColumn
        {
    
    
          ColumnName = "CalculationMethod" + item.Id
        });
      }

      // 添加考核年度
      dtUser.Columns.Add(new DataColumn
      {
    
    
        ColumnName = "AssessmentYear"
      });
      // 添加实发年终奖
      dtUser.Columns.Add(new DataColumn
      {
    
    
        ColumnName = "YearBonus"
      });

      // 给 dtUser 填充数据
      List<UserAppraisalCoefficients_xy> UserAppraisalCoefficients = UserAppraisalCoefficients_xy.ListAll();
      for (int i = 0; i < dtUser.Rows.Count; i++)
      {
    
    
        var uacFilter = UserAppraisalCoefficients.FindAll(m => m.UserId == (int)dtUser.Rows[i]["Id"] && m.AssessmentYear == Convert.ToInt32(comboBox1.Text));
        // 技术计算的数组,用于存放每个考核类型的总系数
        double[] yearBonusArray = new double[uacFilter.Count];

        for (int j = 0; j < uacFilter.Count; j++)
        {
    
    
          // 获取 AppraisalType 对应的 dtUser 的 ColumnName 的值
          // 获取考核次数
          string AppraisalTypeKey = "AppraisalType" + uacFilter[j].CoefficientId;
          double AppraisalTypeCountValue = uacFilter[j].Count;
          // 获取考核系数
          string AppraisalCoefficientKey = "AppraisalCoefficient" + uacFilter[j].CoefficientId;
          double AppraisalCoefficientValue = uacFilter[j].AppraisalCoefficient;
          // 获取计算方式
          string CalculationMethodKey = "CalculationMethod" + uacFilter[j].CoefficientId;
          int CalculationMethodValue = uacFilter[j].CalculationMethod;

          // 给 dtUser 绑定值
          dtUser.Rows[i][AppraisalTypeKey] = AppraisalTypeCountValue;
          dtUser.Rows[i][AppraisalCoefficientKey] = AppraisalCoefficientValue;
          dtUser.Rows[i][CalculationMethodKey] = CalculationMethodValue;

          // 计算考核项系数
          // “考核系数” * “次数” * “计算方式”
          yearBonusArray[j] = AppraisalCoefficientValue * AppraisalTypeCountValue * CalculationMethodValue;
        }
        // 获取考核年份
        dtUser.Rows[i]["AssessmentYear"] = comboBox1.Text;
        // 结算实发年终奖
        double yearBonusAll = 0;
        for (int k = 0; k < yearBonusArray.Length; k++)
        {
    
    
          yearBonusAll = yearBonusAll + yearBonusArray[k];
        }
        // 计算实发年终奖【类型转换为 Double:Convert.ToDouble()】
        double yearBonus = (1 + yearBonusAll) * Convert.ToDouble(dtUser.Rows[i]["AppraisalBase"]);
        // 判断扣费太多情况,钱数被扣为负数,直接为0
        // 表格中第 i 行的 YearBonus = 如果 yearBonus 小于0 yearBonus=0 否则为 yearBonus 本身
        dtUser.Rows[i]["YearBonus"] = yearBonus < 0 ? 0 : yearBonus;
      }
      dataGridView1.AutoGenerateColumns = false;
      dataGridView1.DataSource = dtUser;
    }

    private void SetCol()
    {
    
    
      // 获取 s01_AppraisalCoefficients 表中所有的数据
      List<AppraisalCoefficients_xy> AppraisalCoefficients = AppraisalCoefficients_xy.ListAll();
      List<DataGridViewTextBoxColumn> dataGridViewTextBoxColumns = new List<DataGridViewTextBoxColumn>();
      foreach (var appc in AppraisalCoefficients)
      {
    
    
        // 动态加载
        dataGridViewTextBoxColumns.Add(new DataGridViewTextBoxColumn
        {
    
    
          // 表头【显示内容】
          HeaderText = appc.AppraisalType,
          // 表头名
          Name = "AppraisalType" + appc.Id.ToString(),
          // 绑定的数据
          DataPropertyName = "AppraisalType" + appc.Id.ToString(),
          ReadOnly = true,
          Width = 88
        });
        dataGridViewTextBoxColumns.Add(new DataGridViewTextBoxColumn
        {
    
    
          HeaderText = "系数",
          Name = "AppraisalCoefficient" + appc.Id.ToString(),
          DataPropertyName = "AppraisalCoefficient" + appc.Id.ToString(),
          ReadOnly = true,
          Visible = false,
          Width = 88
        });
        dataGridViewTextBoxColumns.Add(new DataGridViewTextBoxColumn
        {
    
    
          HeaderText = "计算方式",
          Name = "CalculationMethod" + appc.Id.ToString(),
          DataPropertyName = "CalculationMethod" + appc.Id.ToString(),
          ReadOnly = true,
          Visible = false,
          Width = 88
        });
      }
      dataGridView1.Columns.AddRange(dataGridViewTextBoxColumns.ToArray());

      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
      {
    
    
        HeaderText = "考核年度",
        Name = "AssessmentYear",
        DataPropertyName = "AssessmentYear",
        ReadOnly = true,
        Width = 166
      });
      dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
      {
    
    
        HeaderText = "实发年终奖",
        Name = "YearBonus",
        DataPropertyName = "YearBonus",
        ReadOnly = true,
        Width = 166
      });
    }

    private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
    {
    
    
      // 在 CellMouseDown 前执行
      // 当鼠标按下时
      tsmEdit.Visible = false;
    }

    private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
    
    
      // 在 MouseDown 后执行
      // 在单元格内鼠标按下时
      // 判断鼠标是不是右键点击
      if (e.Button == MouseButtons.Right)
      {
    
    
        if (e.RowIndex > -1)
        {
    
    
          // 为了程序的健壮性,在选择之前先清除当前的选择
          dataGridView1.ClearSelection();
          dataGridView1.Rows[e.RowIndex].Selected = true;
          tsmEdit.Visible = true;
        }
      }
      
    }

    private void tsmEdit_Click(object sender, EventArgs e)
    {
    
    
      string year = comboBox1.Text;
      // 这种转换方式只适用于 object 类型的转换,并且里面的内容是数字,才可以这么做
      int userId = (int)dataGridView1.SelectedRows[0].Cells["Id"].Value;
      FrmUserAppraisalEdit_xy FrmUserAppraisalEdit = new FrmUserAppraisalEdit_xy(userId, year, bindDgv_xy);
      FrmUserAppraisalEdit.ShowDialog();
    }
  }
}

在这里插入图片描述

8.FrmUserAppraisalEdit_xy.cs 窗体文件

控件:groupBox*2、button*3、flowLayoutPanellabeltextBox
在这里插入图片描述

using DevExpress.XtraRichEdit.Commands;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Models;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  public partial class FrmUserAppraisalEdit_xy : Form {
    
    

    private int _UserId;
    private string _year;
    private Action _bindDgv;

    public FrmUserAppraisalEdit_xy()
    {
    
    
      InitializeComponent();
      /* 窗体设置
       * 设置固定边距的边框 -- this.FormBorderStyle = FixedToolWindow;【显示之后不能改变窗体的大小】
       * 窗体显示位置 -- this.StartPosition = CenterScreen;
       */
      // flowLayoutPanel 控件 -- 控件放在里面会自动排列
    }

    /// <summary>
    /// 后面的 :this() 等同于在下面调用了 FrmUserAppraisalEdit_xy() 方法
    /// </summary>
    /// <param name="userId">传过来的用户ID</param>
    /// <param name="year">传过来的审核年份</param>
    public FrmUserAppraisalEdit_xy(int userId, string year, Action bindDgv):this()
    {
    
    
      _UserId = userId;
      _year = year;
      // 用私有的 _bindDgv 接收传过来的 bindDgv
      _bindDgv = bindDgv;
    }

    private void FrmUserAppraisalEdit_xy_Load(object sender, EventArgs e)
    {
    
    
      CreateContorls();
      BindeContorls();
    }

    /// <summary>
    /// 给控件赋值
    /// </summary>
    private void BindeContorls()
    {
    
    
      // 获取数据
      List<UserAppraisals_xy> UserAppraisals = UserAppraisals_xy.ListByUserIdAndYear(_UserId, _year);
      // UserAppraisals 参数没有的时候是不会进去下面循环内部的
      foreach (var ua in UserAppraisals)
      {
    
    
        /* 获取 flowLayoutPanel1 下所有控件【下面几个动态生成的 panel】*/
        var FlCtrs_xy = flowLayoutPanel1.Controls;
        foreach (Control FlCtr in FlCtrs_xy)
        {
    
    
          // FlCtr -- 取出 FlCtrs_xy 下面的单个 panel
          if (FlCtr is Panel)
          {
    
    
            var PlCtrs_xy = FlCtr.Controls;
            foreach (var PlCtr in PlCtrs_xy)
            {
    
    
              /* PlCtr -- 取出 PlCtrs_xy 下面的单个控件【Label或TextBox】*/
              if (PlCtr is TextBox)
              {
    
    
                // 评估类型ID
                int acId = Convert.ToInt32(((TextBox)PlCtr).Name.Split('_')[1]);

                // 这里需要判断,碰到一个人不是全有或者全无就会报错
                var v = UserAppraisals.Find(m => m.CoefficientID == acId);
                if (v != null)
                {
    
    
                  string str = v.Count.ToString();
                  // 给 相对应的 TextBox 赋值
                  ((TextBox)PlCtr).Text = str;
                }
                else
                {
    
    
                  ((TextBox)PlCtr).Text = "0";
                }

              }
            }
          }
        }
      }
    }

    /// <summary>
    /// 动态生成控件
    /// </summary>
    private void CreateContorls()
    {
    
    
      List<AppraisalCoefficients_xy> AppraisalCoefficients = AppraisalCoefficients_xy.ListAll();
      foreach (var ac in AppraisalCoefficients)
      {
    
    
        Panel panel_xy = new Panel();
        Label label_xy = new Label
        {
    
    
          Location = new Point(0, 4),
          // 动态生成的控件的 Text = 
          Text = ac.AppraisalType,
          Width = 60
        };
        TextBox textBox_xy = new TextBox
        {
    
    
          Location = new Point(66, 0),
          Width = 120,
          Height = 26,
          Name = "txtAppraisalType_" + ac.Id
          //Left = 70
        };
        // 把动态生成的控件添加到 flowLayoutPanel1 上面
        panel_xy.Controls.Add(label_xy);
        panel_xy.Controls.Add(textBox_xy);
        flowLayoutPanel1.Controls.Add(panel_xy);
      }
    }

    private void button1_Click(object sender, EventArgs e)
    {
    
    
      // 保存【删除后再添加】 -- 不推荐使用
      var FlCtrs_xy = flowLayoutPanel1.Controls;
      foreach (Control FlCtr in FlCtrs_xy)
      {
    
    
        // FlCtr -- 取出 FlCtrs_xy 下面的单个 panel
        if (FlCtr is Panel)
        {
    
    
          var PlCtrs_xy = FlCtr.Controls;
          foreach (var PlCtr in PlCtrs_xy)
          {
    
    
            /* PlCtr -- 取出 PlCtrs_xy 下面的单个控件【Label或TextBox】*/
            if (PlCtr is TextBox)
            {
    
    
              int acId = Convert.ToInt32(((TextBox)PlCtr).Name.Split('_')[1]);
              double count = Convert.ToDouble(((TextBox)PlCtr).Text);
              // 删除数据库中原有数据
              UserAppraisals_xy.Delete(_UserId, _year, acId);
              UserAppraisals_xy UserAppraisals = new UserAppraisals_xy
              {
    
    
                Id = Convert.ToInt32(textBox1.Text),
                UserId = _UserId,
                CoefficientID = acId,
                AssessmentYear = Convert.ToInt32(_year),
                Count = count,
                IsDel = false
              };
              // 向数据库中添加数据【上面删除这里添加就相当于修改了】
              UserAppraisals_xy.Insert(UserAppraisals);
            }
          }
        }
      }
      MessageBox.Show("修改成功");
      // 执行委托
      _bindDgv();
      this.Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    
    
      this.Close();
    }

    private void button3_Click(object sender, EventArgs e)
    {
    
    
      // 保存【修改】有空了再写,还可以复习一遍相关知识点
    }
  }
}

在这里插入图片描述

9.FrmUserManager_xy.cs 窗体文件

控件:dataGridViewgroupBoxlabel*2、TextBoxcomboBoxcheckBox1button1contextMenuStrip
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Models;

namespace WindowsFormsApp_xiaoyin01 {
    
    

  // 第一步:声明委托的关键字
  /// <summary>
  /// delegate 声明委托的关键字。
  /// 类似我们自己声明了一个关键字,例如【string/int...】
  /// </summary>
  public delegate void DelBindDgv();

  public partial class FrmUserManager_xy : Form {
    
    

    // 第二步:定义一个委托的参数,例如【int i;】
    DelBindDgv delBindDgv;

    public FrmUserManager_xy()
    {
    
    
      InitializeComponent();
    }

    private void FrmUserManager_xy_Load(object sender, EventArgs e)
    {
    
    
      BindCbx();
      BindDgv();
      // 第三步:把方法赋值给委托变量 delBindDgv
      delBindDgv = BindDgv;
    }

    private void BindDgv()
    {
    
    
      // 通过下面三个字段进行筛选
      string userName = TextBox1.Text.Trim();
      int baseTypeId = (int)comboBox1.SelectedValue;
      bool isStop = checkBox1.Checked;
      // 取消自动填充数据【没有手动添加的数据不会生成新的列】
      dataGridView1.AutoGenerateColumns = false;
      List<UserAppraisalBases_xy> userAppraisalBases01 = UserAppraisalBases_xy.GetListJoinAppraisal();
      if (baseTypeId == 0)
      {
    
    
        dataGridView1.DataSource = userAppraisalBases01.FindAll(m => m.UserName.Contains(userName) && m.IsDel == isStop);
      }
      else
      {
    
    
        dataGridView1.DataSource = userAppraisalBases01.FindAll(m => m.UserName.Contains(userName) && m.BaseTypeld == baseTypeId && m.IsDel == isStop);
      }
    }

    /// <summary>
    /// 绑定 comboBox1 ,向 comboBox1 中添加数据
    /// </summary>
    private void BindCbx()
    {
    
    
      /* FrmUserManager_xy 窗体设置
       * FormBorderStyle: None; 设置窗体为无边框窗体
       * WindowState: Maximized; 设置窗体显示时 为最大化
       **/
      List<AppraisalBases_xy> AppraisalBases = new List<AppraisalBases_xy>();
      AppraisalBases.Add(new AppraisalBases_xy
      {
    
    
        Id = 0,
        BaseType = "-查询所有-",
        AppraisalBase = 0,
        IsDel = false
      });
      // List 是它的子类
      IEnumerable<AppraisalBases_xy> AppraisalBases02 = AppraisalBases_xy.ListAll();
      // AddRange添加范围:添加整个 ListAll 集合
      // 显示接受的是 IEnumerable 集合,但是也可以直接接受 List 集合,是因为 里氏替换原则:面向对象的基本原则之一【父类可以接受子类】
      AppraisalBases.AddRange(AppraisalBases02);

      /* AppraisalBases = AppraisalBases_xy.ListAll();
      // 向集合中角标为 0 的地方插入一条数据
      AppraisalBases.Insert(0, new AppraisalBases_xy
      {
        Id = 0,
        BaseType = "-查询所有-",
        AppraisalBase = "0",
        IsDel = "false"
      }); */

      // 获取数据源,为 List 里面的数据【是一些很恶心的东西,需要下面显示正确的】
      comboBox1.DataSource = AppraisalBases;
      // 显示的正常的数据
      comboBox1.DisplayMember = "BaseType";
      // 数据表里面的数据有关联的
      comboBox1.ValueMember = "id";
      // 不建议使用下面的方法给 comboBox1 添加数据
      //comboBox1.Text = "-查询所有-";
      //comboBox1.Items.Add("-查询所有-");
      //foreach (var appraisalBases in AppraisalBases)
      //{
    
    
      //  comboBox1.Items.Add(appraisalBases.BaseType);
      //}
    }

    private void button1_Click(object sender, EventArgs e)
    {
    
    
      BindDgv();
    }

    private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
    {
    
    
      // 鼠标点击控件所有区域

      // 如果鼠标是右键点击
      if(e.Button == MouseButtons.Right)
      {
    
    
        tsmAdd.Visible = true;
        tsmEdit.Visible = false;
        tsmStart.Visible = false;
        tsmStop.Visible = false;
      }
    }

    private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
    
    
      // 鼠标点击控件单元格区域

      // dataGridView1.SelectionMode = RowHeaderSelect【默认为选中某个单元格】,改成 FullRowSelect【选中一行】
      // dataGridView1.MultiSelect = True【默认:允许多行选择】,改成 false【禁止多行选择】
      if (e.Button == MouseButtons.Right)
      {
    
    
        // 如果选中了某行
        if (e.RowIndex > -1)
        {
    
    
          // 鼠标右键选中当前行
          dataGridView1.Rows[e.RowIndex].Selected = true;
          tsmAdd.Visible = true;
          tsmEdit.Visible = true;
          // 选择的行的下标为0的行,下面的属性名为 IsDel 的值
          bool isDel = (bool)dataGridView1.SelectedRows[0].Cells["IsDel"].Value;
          // 如果选择行的 IsDel 为True【表示为已停职】
          if (isDel)
          {
    
    
            tsmStart.Visible = true;
          }
          else
          {
    
    
            tsmStop.Visible = true;
          }
        }
      }
    }

    private void tsmAdd_Click(object sender, EventArgs e)
    {
    
    
      // 把委托的方法变量传过去,也就是刷新页面
      FrmSetUser_xy FrmSetUser01 = new FrmSetUser_xy(delBindDgv);
      // 模式窗体打开不会往下继续执行,关闭后继续往下执行
      FrmSetUser01.ShowDialog();
      BindDgv();
    }

    private void tsmEdit_Click(object sender, EventArgs e)
    {
    
    
      int id = (int)dataGridView1.SelectedRows[0].Cells["Id"].Value;
      FrmSetUser_xy frmSetUser = new FrmSetUser_xy(delBindDgv, id);
      frmSetUser.ShowDialog();
    }
  }
}

在这里插入图片描述

10.Program.cs 文件

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01 {
    
    
  static class Program {
    
    
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
    
    
      // 程序刚开始的时候
      // 连接字符串        ["ConStr"]:是App.config里面填加的
      SqlHelper.ConStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new FrmMain_xy());
    }
  }
}

三、项目 WindowsFormsApp_xiaoyin01.Models 下的文件内容

1.AppraisalBases_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class AppraisalBases_xy {
    
    
    public int Id {
    
     get; set; }
    public string BaseType {
    
     get; set; }
    public int AppraisalBase {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static List<AppraisalBases_xy> ListAll()
    {
    
    
      List<AppraisalBases_xy> AppraisalBases = new List<AppraisalBases_xy>();
      DataTable dt = SqlHelper.ExecuteTable("SELECT * FROM s01_AppraisalBases");
      foreach (DataRow dRow in dt.Rows)
      {
    
    
        AppraisalBases.Add(ToModel(dRow));
      }
      return AppraisalBases;
    }

    /// <summary>
    /// 修改基数信息
    /// </summary>
    /// <param name="user">基数的参数信息</param>
    /// <returns>受影响行数</returns>
    public static int Updata(AppraisalBases_xy AppraisalBases)
    {
    
    
      int row = SqlHelper.ExecuteNonQuery("UPDATE s01_AppraisalBases SET Id=@Id, BaseType=@BaseType, AppraisalBase=@AppraisalBase, IsDel=@IsDel where Id=@Id",
        new SqlParameter("@Id", AppraisalBases.Id),
        new SqlParameter("@BaseType", AppraisalBases.BaseType),
        new SqlParameter("@AppraisalBase", AppraisalBases.AppraisalBase),
        new SqlParameter("@IsDel", AppraisalBases.IsDel)
        );
      return row;
    }

    // 把数据库里面的对象,转换成实体对象
    private static AppraisalBases_xy ToModel(DataRow dr)
    {
    
    
      AppraisalBases_xy AppraisalBases = new AppraisalBases_xy();
      AppraisalBases.Id = (int)dr["id"];
      AppraisalBases.BaseType = dr["BaseType"].ToString();
      AppraisalBases.AppraisalBase = (int)dr["AppraisalBase"];
      AppraisalBases.IsDel = (bool)dr["IsDel"];
      return AppraisalBases;
    }

  }
}

2.AppraisalCoefficients_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class AppraisalCoefficients_xy {
    
    
    public int Id {
    
     get; set; }
    public string AppraisalType {
    
     get; set; }
    public double AppraisalCoefficient {
    
     get; set; }
    public int CalculationMethod {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static List<AppraisalCoefficients_xy> ListAll()
    {
    
    
      List<AppraisalCoefficients_xy> AppraisalCoefficients = new List<AppraisalCoefficients_xy>();
      DataTable dt = SqlHelper.ExecuteTable("SELECT * FROM s01_AppraisalCoefficients");
      foreach (DataRow dr in dt.Rows)
      {
    
    
        // TModel 泛型 上面加了this就从普通方法变成了扩展方法,可以直接用this修饰的参数 dr 点出 DataRowModel
        AppraisalCoefficients.Add(dr.DataRowModel<AppraisalCoefficients_xy>());
      }
      return AppraisalCoefficients;
    }
  }
}

3.UserAppraisalBases_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class UserAppraisalBases_xy {
    
    
    public int Id {
    
     get; set; }
    public string UserName {
    
     get; set; }
    public string Sex {
    
     get; set; }
    public int BaseTypeld {
    
     get; set; }
    public string BaseType {
    
     get; set; }
    public int AppraisalBase {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static DataTable GetListDtJoinAppraisal()
    {
    
    
      DataTable dt = SqlHelper.ExecuteTable("SELECT a.id,a.UserName,a.sex,b.BaseType,a.BaseTypeld,b.AppraisalBase,a.isDel FROM s01_Users AS a LEFT JOIN s01_AppraisalBases AS b ON a.BaseTypeld=b.id");
      return dt;
    }

    public static List<UserAppraisalBases_xy> GetListJoinAppraisal()
    {
    
    
      List<UserAppraisalBases_xy> UserAppraisalBases02 = new List<UserAppraisalBases_xy>();
      DataTable dt = GetListDtJoinAppraisal();
      foreach (DataRow dr02 in dt.Rows)
      {
    
    
        UserAppraisalBases02.Add(ToModel(dr02));
      }
      return UserAppraisalBases02;
    }

    private static UserAppraisalBases_xy ToModel(DataRow dr)
    {
    
    
      UserAppraisalBases_xy UserAppraisalBases01 = new UserAppraisalBases_xy();
      UserAppraisalBases01.Id = (int)dr["Id"];
      UserAppraisalBases01.UserName = dr["UserName"].ToString();
      UserAppraisalBases01.Sex = dr["Sex"].ToString();
      UserAppraisalBases01.BaseTypeld = (int)dr["BaseTypeld"];
      UserAppraisalBases01.BaseType = dr["BaseType"].ToString();
      UserAppraisalBases01.AppraisalBase = (int)dr["AppraisalBase"];
      UserAppraisalBases01.IsDel = (bool)dr["IsDel"];
      return UserAppraisalBases01;
    }

  }
}

4.UserAppraisalCoefficients_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class UserAppraisalCoefficients_xy {
    
    
    public int Id {
    
     get; set; }
    public int UserId {
    
     get; set; }
    public int CoefficientId {
    
     get; set; }
    public double Count {
    
     get; set; }
    public int AssessmentYear {
    
     get; set; }
    public string AppraisalType {
    
     get; set; }
    public double AppraisalCoefficient {
    
     get; set; }
    public int CalculationMethod {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static List<UserAppraisalCoefficients_xy> ListAll()
    {
    
    
      List<UserAppraisalCoefficients_xy> UserAppraisalCoefficients = new List<UserAppraisalCoefficients_xy>();
      DataTable dt = SqlHelper.ExecuteTable("SELECT ua.*,ac.AppraisalType,ac.AppraisalCoefficient,ac.CalculationMethod FROM s01_UserAppraisals AS ua LEFT JOIN s01_AppraisalCoefficients AS ac ON ua.CoefficientID=ac.id");
      foreach (DataRow dar in dt.Rows)
      {
    
    
        UserAppraisalCoefficients.Add(dar.DataRowModel<UserAppraisalCoefficients_xy>());
      }
      return UserAppraisalCoefficients;
    }
  }
}

5.UserAppraisals_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class UserAppraisals_xy {
    
    
    public int Id {
    
     get; set; }
    public int UserId {
    
     get; set; }
    public int CoefficientID {
    
     get; set; }
    public double Count {
    
     get; set; }
    public int AssessmentYear {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static List<UserAppraisals_xy> ListByUserIdAndYear(int userId, string year)
    {
    
    
      List<UserAppraisals_xy> UserAppraisals = new List<UserAppraisals_xy>();
      DataTable dt = SqlHelper.ExecuteTable("SELECT * FROM s01_UserAppraisals WHERE UserId = @UserId AND AssessmentYear = @AssessmentYear",
        new SqlParameter("@UserId", userId),
        new SqlParameter("@AssessmentYear", year));
      foreach (DataRow dar in dt.Rows)
      {
    
    
        UserAppraisals.Add(dar.DataRowModel<UserAppraisals_xy>());
      }
      return UserAppraisals;
    }

    public static void Insert(UserAppraisals_xy UserAppraisals) {
    
    
      // 使用 【+user.Id+】或者前面加 $ 后面直接在{}里面写参数,都容易 SQL注入式攻击
      // 防止SQL注入攻击的方式:SQL语句参数化【在 SqlHelper 文件中的 ExecuteNonQuery 方法后面添加参数 sqlParameters】
      SqlHelper.ExecuteNonQuery("INSERT INTO s01_UserAppraisals (id, UserId, CoefficientID, Count, AssessmentYear, IsDel) VALUES " +
        "(@id, @UserId, @CoefficientID, @Count, @AssessmentYear, @IsDel)",
        new SqlParameter("@id", UserAppraisals.Id),
        new SqlParameter("@UserId", UserAppraisals.UserId),
        new SqlParameter("@CoefficientID", UserAppraisals.CoefficientID),
        new SqlParameter("@Count", UserAppraisals.Count),
        new SqlParameter("@AssessmentYear", UserAppraisals.AssessmentYear),
        new SqlParameter("@IsDel", UserAppraisals.IsDel)
        );
    }

    public static void Delete(int userId, string AssessmentYear, int CoefficientID)
    {
    
    
      SqlHelper.ExecuteNonQuery("DELETE FROM s01_UserAppraisals WHERE UserId = @UserId AND AssessmentYear = @AssessmentYear AND CoefficientID = @CoefficientID",
        new SqlParameter("@UserId", userId),
        new SqlParameter("@AssessmentYear", AssessmentYear),
        new SqlParameter("@CoefficientID", CoefficientID)
        );

    }

  }
}

6.Users_xy.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApp_xiaoyin01.Utility;

namespace WindowsFormsApp_xiaoyin01.Models {
    
    
  public class Users_xy {
    
    
    public int Id {
    
     get; set; }
    public string UserName {
    
     get; set; }
    public string Sex {
    
     get; set; }
    public string PassWord {
    
     get; set; }
    public int BaseTypeld {
    
     get; set; }
    public bool IsDel {
    
     get; set; }

    public static List<Users_xy> ListAll()
    {
    
    
      DataTable dt = SqlHelper.ExecuteTable("SELECT * FROM s01_Users");
      List<Users_xy> users = new List<Users_xy>();
      foreach (DataRow dr in dt.Rows)
      {
    
    
        users.Add(dr.DataRowModel<Users_xy>());
      }
      return users;
    }

    /// <summary>
    /// 新增用户
    /// </summary>
    /// <param name="user">用户的参数信息</param>
    /// <returns>受影响行数</returns>
    public static int Insert(Users_xy user)
    {
    
    
      // 使用 【+user.Id+】或者前面加 $ 后面直接在{}里面写参数,都容易 SQL注入式攻击
      // 防止SQL注入攻击的方式:SQL语句参数化【在 SqlHelper 文件中的 ExecuteNonQuery 方法后面添加参数 sqlParameters】
      return SqlHelper.ExecuteNonQuery("INSERT INTO s01_Users (id, UserName, Password, Sex, BaseTypeld, IsDel) VALUES " +
        "(@id, @UserName, @Password, @Sex, @BaseTypeld, @IsDel)",
        new SqlParameter("@id", user.Id),
        new SqlParameter("@UserName", user.UserName),
        new SqlParameter("@Password", user.PassWord),
        new SqlParameter("@Sex", user.Sex),
        new SqlParameter("@BaseTypeld", user.BaseTypeld),
        new SqlParameter("@IsDel", user.IsDel)
        );
    }

    /// <summary>
    /// 修改用户信息
    /// </summary>
    /// <param name="user">用户的参数信息</param>
    /// <returns>受影响行数</returns>
    public static int Updata(Users_xy user)
    {
    
    
      int row = SqlHelper.ExecuteNonQuery("UPDATE s01_Users SET id=@id, UserName=@UserName, Password=@Password, Sex=@Sex, BaseTypeld=@BaseTypeld, IsDel=@IsDel where Id=@id",
        new SqlParameter("@id", user.Id),
        new SqlParameter("@UserName", user.UserName),
        new SqlParameter("@Password", user.PassWord),
        new SqlParameter("@Sex", user.Sex),
        new SqlParameter("@BaseTypeld", user.BaseTypeld),
        new SqlParameter("@IsDel", user.IsDel)
        );
      return row;
    }

  }
}

四、项目 WindowsFormsApp_xiaoyin01.Utility 下的文件内容

1.SqlHelper.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp_xiaoyin01.Utility {
    
    
  public class SqlHelper {
    
    
    public static string ConStr {
    
     get; set; }

    /// <summary>
    /// SQL 查询操作
    /// </summary>
    /// <param name="sqlTxt">SQL语句</param>
    /// <returns>查询到的数据</returns>
    public static DataTable ExecuteTable(string sqlTxt, params SqlParameter[] sqlParameters)// 参数化,同下面的增删改
    {
    
    
      // using:可以自动释放资源;SqlConnection:SQL连接
      using (SqlConnection conn = new SqlConnection(ConStr))
      {
    
    
        // 打开数据库
        conn.Open();
        // SQL命令的执行【conn就相当于执行的上方宝剑】(cmd 是管理员)
        SqlCommand cmd = new SqlCommand(sqlTxt, conn);
        // SQL语句的参数,向 sqlParameters 的末尾添加一个参数
        cmd.Parameters.AddRange(sqlParameters);
        // SQL适配器 (sda 是小推车,管理员推车小推车)
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        // 数据集 (ds 相当于汽车)
        DataSet ds = new DataSet();
        // 管理员把小推车里面的数据放进汽车里面
        sda.Fill(ds);
        // 到家后 拿出车上序号为 0 的数据进行返回
        return ds.Tables[0];
      }
    }

    /// <summary>
    /// SQL 增、删、改操作
    /// <param name="sqlTxt">SQL语句</param>
    /// <param name="sqlParameters">SQL参数,可以为空【params 关键字】</param>
    /// </summary>
    /// <returns>受影响行数</returns>
    public static int ExecuteNonQuery(string sqlTxt, params SqlParameter[] sqlParameters)
    {
    
    
      // using:可以自动释放资源;SqlConnection:SQL连接
      using (SqlConnection conn = new SqlConnection(ConStr))
      {
    
    
        // 打开数据库
        conn.Open();
        // SQL命令的执行【conn就相当于执行的上方宝剑】(cmd 是管理员)
        SqlCommand cmd = new SqlCommand(sqlTxt, conn);
        // SQL语句的参数,向 sqlParameters 的末尾添加一个参数
        cmd.Parameters.AddRange(sqlParameters);
        // 返回受影响的行数
        int row = cmd.ExecuteNonQuery();
        if (row <= 0)
        {
    
    
          // 当没有受影响的行数时,返回的错误提示【打开下面的这个时,受影响行数为0则报错】
          // throw new Exception("亲,没有受影响的行数哦!!!");
        }
        return row;
      }
    }
    
  }
}

2.ToModel.cs 类文件

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp_xiaoyin01.Utility {
    
    
  public static class ToModel {
    
    

    // TModel 泛型 上面加了this就从普通方法变成了扩展方法,可以直接用this修饰的参数 dr 点出 DataRowModel
    public static TModel DataRowModel<TModel>(this DataRow dr)
    {
    
    
      // typeof(TModel)【泛型 TModel 的类型】
      Type type = typeof(TModel);
      // 实例化
      TModel md = (TModel)Activator.CreateInstance(type);
      foreach (var prop in type.GetProperties())
      {
    
    
        // 获取值 【类似 (int)dr["Id"]; 】,赋值给了 md
        prop.SetValue(md, dr[prop.Name]);
      }
      return md;
    }
  }
}

笔记源码


一点点笔记,以便以后翻阅。

猜你喜欢

转载自blog.csdn.net/qq_44111597/article/details/109101592