学习来源:B站全栈ACE(讲的很好,推荐!)

1.项目简介及业务逻辑和数据库设计

知识点主要涉及:父容器详解,数据库连接查询,数据绑定与获取,委托,Sql语句参数化,泛型反射,反射,分层架构,工厂模式,普通缓存,泛型缓存,单例在winform的经典使用,动态化控件放置,datagridview不定项绑定。


首先,在Sql Server中新建表(Sql Server是真难下,我下了两天,其中安装遇到无法启动服务的问题,安装到最后显示

安装 SQL Server 数据库引擎服务实例功能 时出错 SQL Server
功能“SQL_Engine_Core_Inst”所处的状态不支持修复,因为从未成功配置该功能。只能修复成功安装的功能。若要继续,请删除指定的
SQL Server 功能。 错误代码: 0x84B40002

用了很多解决方法,最后成功的解决方法附上链接:数据库SQL Server 2008安装时提示代理服务器提供的凭据无效)

在新建表的过程中,遇到一些问题:
1.想要给各个列都加备注:列属性-表设计器-说明
2.sql server怎么设置id字段自增
3.给表设置外键

问题1:没看懂这里自增了之后是怎么从1021开始的。

2.Winform的框架及树形菜单搭建

1.拖进去一个SplitContainer,把软件分成两个Panel

2.新建一个treeview

更改字体(Font)和行间距(ItemHeight),设置其停靠在父容器(右上角小三角),把前面的虚线去掉(ShowLines = false),设置满行选择(FullRowSelect = true)

3.在Panel2新建一个人员管理页面,添加windows窗体命名为FrmUserManager.cs

4.在上方添加一个groupbox(Text = 筛选),下方新建一个datagridview

5.为了让控件跟随窗口拉伸而改变大小,设置anchor属性

上方groupbox的anchor = top,left,right
下方datagridview的anchor = top(为了让上下两部分控件之间没有间隔),bottom,left,right

6.为了让右边窗体嵌套在主窗体中

  1. 将主窗体FrmMain的属性IsMidContainer值设置为true
  2. 在FrmMain.cs中加入代码
private void FrmMain_Load(object sender, EventArgs e)
{FrmUserManager frmUserManager = new FrmUserManager();frmUserManager.MdiParent = this;frmUserManager.Parent = splitContainer1.Panel2;frmUserManager.Show();//不能用ShowDialog
}
  1. 为了让右边窗体显示正确,把FrmUserManager窗体属性值FormBorderStyle = None,WindowState = Maximized

7. 继续新增控件

3.SqlHelper和自动释放

1.新增两个文件夹

  • /Models存放实体模型
  • /Utility存放工具类

2.在/Utility中新建一个SqlHelper类

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Appraisal_Systerm.Utility
{public class SqlHelper{// 连接字符串public static string ConStr { get; set; }public static DataTable ExecuteTable(string cmdText){using(SqlConnection conn = new SqlConnection(ConStr)){conn.Open();SqlCommand cmd = new SqlCommand(cmdText, conn);SqlDataAdapter sda = new SqlDataAdapter(cmd);DataSet ds = new DataSet();sda.Fill(ds);return ds.Tables[0];}}// 取数据public static int ExecuteNonQuery(string cmdText){using (SqlConnection conn = new SqlConnection(ConStr)){conn.Open();SqlCommand cmd = new SqlCommand(cmdText, conn);int rows = cmd.ExecuteNonQuery();if (rows <= 0){throw new Exception("数据库操作失败");}return rows;}}}
}

没找到这部分前面课程在哪讲的,只能先用着找到了再加上。

3.修改App.config设置连接字符串

<!--没有网的情况下DataSource = 127.0.0.1 如果只写一个.会报错-->
<?xml version="1.0" encoding="utf-8" ?>
<configuration><connectionStrings><add name="ConStr" connectionString="Data Source=.;database=PerformanceAppraisalDb;uid=sa;pwd=123456" /></connectionStrings><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /></startup>
</configuration>

4.修改Program.cs代码,获取3编写的连接字符串

SqlHelper.ConStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;

4.充血模型的实体创建

充血模型:既有属性又有方法的类称为充血模型,只有属性没有方法的类称为贫血模型。

实现功能:让基数表的内容显示在页面的下拉菜单中

1.在/Models文件夹新建一个类AppraisalBases.cs,目的是获取基数表

using Appraisal_Systerm.Utility;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Appraisal_Systerm.Models
{public class AppraisalBases{// 属性与数据表AppraisalBases中列的内容一致public int Id { get; set; }public string BaseType { get; set; }public int AppraisalBase { get; set; }public bool IsDel { get; set; }// 通过List集合存储指定的类型对象的集合public static List<AppraisalBases> ListAll(){List<AppraisalBases> appraisalBases = new List<AppraisalBases>();DataTable dt = SqlHelper.ExecuteTable("SELECT * FROM AppraisalBases");foreach(DataRow dr in dt.Rows){appraisalBases.Add(ToModel(dr));}return appraisalBases;}// 把数据库里的对象转换为实体对象private static AppraisalBases ToModel(DataRow dr){AppraisalBases appraisalBase = new AppraisalBases();appraisalBase.Id = (int)dr["Id"];appraisalBase.BaseType = dr["BaseType"].ToString();appraisalBase.AppraisalBase = (int)dr["AppraisalBase"];appraisalBase.IsDel = (bool)dr["IsDel"];return appraisalBase;}}
}

2.修改FrmUserManager.cs代码,目的是让基数表的内容显示在 页面的下拉菜单中

调试途中遇到了一些愚蠢的bug
1.无法识别的配置节 connectionString

System.Configuration.ConfigurationErrorsException
HResult=0x80131902
Message=配置系统未能初始化
Source=System.Configuration
StackTrace:
在 System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey)
在 System.Configuration.ClientConfigurationSystem.PrepareClientConfigSystem(String sectionName)
在 System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
在 System.Configuration.ConfigurationManager.get_ConnectionStrings()
在 Appraisal_Systerm.Program.Main() 在 D:\study\C#学习程序\全栈ACEC#基础\Appraisal_Systerm\Appraisal_Systerm\Program.cs 中: 第 19 行
内部异常 1:
ConfigurationErrorsException: 无法识别的配置节 connectionString。 (D:\study\C#学习程序\全栈ACEC#基础\Appraisal_Systerm\Appraisal_Systerm\bin\Debug\Appraisal_Systerm.exe.Config line 3)

解决办法:App.config中connectionStrings少打了一个s,所以说还得仔细看报错,上面说line3,还真是line3。

2.conn.Open()报错

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接)”

解决方法:把App.config中的Data Source=127.0.0.1改成.
3.列“AppraisalBase”不属于表 Table
数据库新建表时列名写错了,改了之后重新连接数据库重新运行程序还报错发现是sql server没点保存。
(只想对我自己说一句:愚蠢的人类!)

5.数据源绑定的多种方式

        private void BindCbx(){// 三种方法List<AppraisalBases> appraisalBases = new List<AppraisalBases>();/* appraisalBases.Add(new AppraisalBases{Id = 0,BaseType = "-查询所有-",AppraisalBase = 0,IsDel = false});//在第一行加-查询所有-appraisalBases.AddRange(AppraisalBases.ListAll());*/appraisalBases = AppraisalBases.ListAll();appraisalBases.Insert(0, new AppraisalBases{Id = 0,BaseType = "-查询所有-",AppraisalBase = 0,IsDel = false});// 先把列表加进去,再在列表所有内容前面加上-查询所有-// 单向数据源绑定cbxBase.DataSource = appraisalBases;cbxBase.DisplayMember = "BaseType";cbxBase.ValueMember = "Id";/*// 方法一:循环集合给下拉菜单每一项赋值// 不用的原因:获取的内容只是BaseType的文字,实际上还要通过BaseTypeId搜索对应的User// 在下拉菜单第一项加上"-查询所有-"cbxBase.Text = "-查询所有-";cbxBase.Items.Add("-查询所有-");foreach(AppraisalBases appraisalBase in appraisalBases){cbxBase.Items.Add(appraisalBase.BaseType);}*/}

6.表连接查询与数据的自动填充

目的:显示datagridview中数据内容,因为显示的内容是两个表的合并内容
知识点:数据库连接查询(种类:内连接,左连接,右连接,全连接)

1.编写Sql查询语句,对两个表进行左连接

这里之前不太理解为什么没有查询IsDel的值,后来觉得应该是datagridview中IsDel显示的是一个单选框,所以不用添加,还可以直接操作?

SELECT u.Id,u.UserName,u.Sex,u.BaseTypeId,a.BaseType,a.AppraisalBase FROM Users u LEFT JOIN AppraisalBases a ON u.BaseTypeId= a.Id

2.在/Models新增一个UserAppraisalBases.cs类

using Appraisal_Systerm.Utility;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Appraisal_Systerm.Models
{public class UserAppraisalBases{// 属性与数据表Users,AppraisalBases中列的内容一致public int Id { get; set; }public string UserName { get; set; }public string Sex { get; set; }public int BaseTypeId { get; set; }public string BaseType { get; set; }public int AppraisalBase { get; set; }public bool IsDel { get; set; }// 获取数据表public static List<UserAppraisalBases> GetListJoinAppraisal(){List<UserAppraisalBases> userAppraisalBases = new List<UserAppraisalBases>();DataTable dt = SqlHelper.ExecuteTable("SELECT u.Id,u.UserName,u.Sex,u.BaseTypeId,u.IsDel,a.BaseType,a.AppraisalBase FROM Users u LEFT JOIN AppraisalBases a ON u.BaseTypeId= a.Id");foreach (DataRow dr in dt.Rows){userAppraisalBases.Add(ToModel(dr));}return userAppraisalBases;}private static UserAppraisalBases ToModel(DataRow dr){UserAppraisalBases userAppraisalBase = new UserAppraisalBases();userAppraisalBase.Id = (int)dr["Id"];userAppraisalBase.UserName = dr["UserName"].ToString();userAppraisalBase.Sex = dr["Sex"].ToString();userAppraisalBase.BaseTypeId = (int)dr["BaseTypeId"];userAppraisalBase.BaseType =dr["BaseType"].ToString();userAppraisalBase.AppraisalBase = (int)dr["AppraisalBase"];userAppraisalBase.IsDel = (bool)dr["IsDel"];return userAppraisalBase;}}
}

3.修改FrmUserManager.cs代码,让左链接的表在datagridview中显示出来

导入之后,表明自动显示为英文Id,UserName…,为了自定义表头,点击设计器的datagridview右上方三角编辑列,新建之后修改列的属性DataPropertyName和Name相同,和数据库表关联起来。

dgvUserAppraisal.DataSource = UserAppraisalBases.GetListJoinAppraisal();

4.取消自动填充列

进行这一步的目的是BaseTypeId也会在datagridview中显示出来,而并不需要这一列。

dgvUserAppraisal.AutoGenerateColumns = false;

C#项目绩效考核实战提升(一)相关推荐

  1. C#项目绩效考核实战提升(三)

    16.构造方法的重载及调用 功能:编辑用户 在FrmSetUser.cs中对FrmSetUser构造方法进行重载 // 对构造方法进行重载,构造方法就是在实例化这个类的对象的时候首先要调用的方法 // ...

  2. C#项目绩效考核实战提升(四)

    26.空白窗体的妙用及动态列的梳理 1.由于没有开发系数管理,所以点击系数管理菜单会报错 解决办法: 在FrmMain.cs中,Tag后面加了一个问号,表示当Tag为空时也赋值,但是需要注意的是,根据 ...

  3. 项目绩效考核体系指标建设

    项目绩效考核体系设计依据: 以项目生命周期为脉络,在对应阶段,对应岗位的人对项目的贡献,可用于考核个人: 在个人考核的基础上,汇总项目管理各个过程组和知识领域,用于团队绩效和项目绩效: 绩效数据产生后 ...

  4. 项目绩效考核体系执行简述

    1.沟通先行,定义沟通规则: 或许每个人都有很多事情要做.都比较忙,但排上计划的事情就要尽量按计划执行: 如果对计划安排有争议,请在计划制定前讨论,准确评估和告知风险,商定计划安排: (1).与研发沟 ...

  5. Springboot毕设项目绩效考核管理系统m29awjava+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目绩效考核管理系统m29awjava+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysq ...

  6. 项目绩效考核体系指标建设图表

    项目绩效考核体系指标建设图表 针对上篇博客<项目绩效考核体系指标建设>设计的项目管理中的绩效考核指标,设计成表格,更加可视化.或许对你有很大的参考意义. 1.绩效考核指标总表 项目绩效 考 ...

  7. 图解项目绩效考核明细表实例

    很多PMO和项目经理对项目绩效考核的问题不太清楚,经常问如何对项目进行考核,下表是一家公司的项目绩效考核明细表,供大家参考.

  8. 项目绩效考核为什么要定指标_为您的项目选择正确的指标

    项目绩效考核为什么要定指标 上个月,我们讨论了为社区指标计划设置目标 . 这些目标不断提醒您要在程序中实现的目标,在准确确定要测量的目标时应将它们用作指标. 本月,我们将记录用于确定要测量的内容的基本 ...

  9. 如何对美工进行绩效考核?提升积极性?

    美工应该怎么做绩效考核?目前疫情还没有退去,这两年我们看到一个最大的变化,就是线下的生意一片萧条,而线上的生意总体来说还不错,包括跨境电商. 所以这几年我们看到就连大爷大妈买菜,他都会到网上买,所以我 ...

最新文章

  1. Java学习笔记(七)--格式化字符串及格式输出
  2. python实现第一个web_我的第一个python web开发框架(6)——第一个Hello World
  3. 2021-11-13SystemStringBuliding
  4. Plugin [id: 'org.jetbrains.kotlin.jvm'] was not found in any of the following sources:
  5. w7计算机不显示cdf盘,微软确认Win7SP1再现黑屏错误
  6. 炸了!中国学者首次被Science撤稿,与之前首次被Nature撤稿的教授来自同一所大学……...
  7. java 中时间计算_java中关于时间的计算
  8. MATLAB教程(1) MATLAB 基础知识(4)
  9. 产品经理如果有捷径,那可能是多读书
  10. regression+classification
  11. tinyint数据类型php筛选时怎么判断_PHP从入门到精通(三)PHP语言基础
  12. 模拟退火算法- 最短路径问题
  13. yum mysql安装 日志_yum 安装与使用MySQL
  14. 魔兽世界单机mysql修改怪物血量_魔兽世界单机版如何修改怪物掉落物品个数
  15. html中引号的作用,引号的作用是什么
  16. 怎么查看笔记本内存条型号_「电脑内存怎么看」电脑内存怎么看大小(内存条怎么看几代型号) - seo实验室...
  17. debian安装mediawiki教程
  18. npm-shrinkwrap
  19. HHUOJ 1019 Friendship of Mouse(水题)
  20. 笔记本电脑怎样当无线服务器,笔记本当无线路由器怎么设置【详细步骤】

热门文章

  1. php生成表格数据类型,phpspreadsheet 中文文档(四) 创建电子表格+档案格式
  2. 小旋风蜘蛛池采集工具教程分享
  3. vscode_历史版本下载_便携版/安装版
  4. intel parallel studio xe 2020 Update 4
  5. 起点web端体验报告
  6. 逸创云客服获“金耳唛杯”年度中国最佳客户中心技术产品奖
  7. Git--SSH登录
  8. Vue3的组件开发大法不完全指北
  9. Win10家庭版远程桌面工具RDP Wrapper出现Not listening解决方案
  10. 【往届EI已检索】2023年第三届应用数学、建模与智能计算国际研讨会(CAMMIC2023)