本文代码仓库地址:gitee码云CSDN笔记仓库地址
目录
数据库
- 数据库资源地址:码云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 窗体文件
控件:
dataGridView
、panel
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 窗体文件
控件:
splitContainer
、treeView
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 窗体文件
控件:
groupBox
、dataGridView
、comboBox
、label
、contextMenuStrip
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、flowLayoutPanel
、label
、textBox
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 窗体文件
控件:
dataGridView
、groupBox
、label
*2、TextBox
、comboBox
、checkBox1
、button1
、contextMenuStrip
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;
}
}
}
一点点笔记,以便以后翻阅。