介绍两个模块:员工入职,和员工返职
1、员工入职:
这一部分模块主要涉及的是ComboBox和LookUpEdit(DevExpress)绑定数据源,GV列添加超链接列,超链接文本弹出窗体传值取值,单线程从Access数据库读取信息,Datagridview添加ComboBox列并赋值等。还涉及了递归部门的问题,这个在我其他文章里有单独讲,这里就不贴了。需要的可以移步https://blog.csdn.net/qq_38374540/article/details/106259895这里查看
- ComboBox和LookUpEdit(DevExpress)绑定数据源
其实我觉得这两个的主要区别就是两列和多列的问题,其他的功能暂时没涉及到,这里ComboBox只能绑定两列,显示只能显示一列,而LookupEdit可以绑定表。
//ComboBox
string sql;
sql = "select company_FK,companyName from sys_tx_kqSystem_userLog where ISNULL(isuse,'N')='Y' and userID='" + FormM.lbluserLog.Text.Trim() + "'";
DataTable dtRzgs;
if (!DB.AF.execSql(sql, sqlconn, out dtRzgs))
{
return;
}
DataRow drRz = dtRzgs.NewRow();
drRz["company_FK"] = "";
drRz["companyName"] = "";
dtRzgs.Rows.InsertAt(drRz, 0);
ddlRzgs.DataSource = dtRzgs;
ddlRzgs.ValueMember = "company_FK";
ddlRzgs.DisplayMember = "companyName";
//LookupEdit
sql = "select replace(Code,' ','') as Code, replace(Name,' ','') as Name,replace( Remark,' ','') as Remark from sys_tx_zply a left join sys_tx_kqSystem b on a.kqSystem = b.kqSystem where b.company_FK = '" + ddlRzgs.SelectedValue.ToString().Trim() + "'";
if (!DB.AF.execSql(sql, sqlconn, out dtzply))
{
return;
}
DataRow drzply = dtzply.NewRow();
drzply["Code"] = "";
drzply["Name"] = "";
drzply["Remark"] = "";
dtzply.Rows.InsertAt(drzply, 0);
ddlzply.Properties.ShowHeader = false;
ddlzply.Properties.ValueMember = "Code";
ddlzply.Properties.DisplayMember = "Name";
ddlzply.Properties.DataSource = dtzply;
ddlzply.Properties.BestFitMode = BestFitMode.BestFitResizePopup;
ddlzply.EditValue = "";
ddlzply.Text = "";
- GV列添加超链接列
DataGridViewLinkColumn dlink = new DataGridViewLinkColumn();
dlink.Text = "删除";
dlink.Name = "linkDelete";
dlink.HeaderText = "删除";
dlink.UseColumnTextForLinkValue = true;
GV.Columns.Insert(0, dlink);
- 超链接文本弹出窗体传值取值
//窗体实例化,弹出窗体,这里有个ShowDialog()和Show()的小知识点
private void labgz_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
//因为我是表头表身都有这个超链接,所以我在传的时候判断了一下是点击表头的还是点击表身的,0是指行项,但是表头没有行项,所以传了0
GongZhong gzForm = new GongZhong(this, "head", 0);
gzForm.gz(ddlRzgs.SelectedValue.ToString().Trim());
gzForm.ShowDialog();
return;
}
catch (Exception ec)
{
MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
//表身的就写在GV的点击事件里
private void GV_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
#region 删除
string buttonText = this.GV.Rows[e.RowIndex].Cells[0].Value.ToString().Trim();
if (buttonText == "删除" && e.RowIndex != -1 && e.ColumnIndex == 0)
{
if (MessageBox.Show("确定删除吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
string errMsg, sql;
this.GV.Rows.RemoveAt(e.RowIndex);
sesstab = (DataTable)GV.DataSource;
if (GV.Rows.Count > 0)
{
byte[] byteImage = (byte[])sesstab.Rows[0]["照片"];
MemoryStream ms = new MemoryStream(byteImage);
Bitmap bmpt = new Bitmap(ms);
pictureBox1.Image = bmpt;
}
else
{
if (ddlzc.SelectedValue.ToString() == "0")
{
//MessageBox.Show(ddlRzgs.SelectedValue.ToString().Trim());
MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
sql = "select a.companyName 公司, b.deptName 部门, a.userID 工号, a.userName 姓名, a.Pycounts 入职次数, a.Sfz 身份证号码, a.G_sfzyxr 身份证生效日 " +
" , a.G_sfzsxr 身份证失效日, a.G_fzjg 签发机关, a.BornDate 出生日期,case when sex = '0' then '男' else '女' end 性别, " +
" PyDate 入职日期,case when IfDaKa = 1 then '是' else '否' end 打卡, Nation_Name 民族, HomeAddr 籍贯, " +
" case when ISNULL(isZc,'')= 'E' then '转厂入职' when ISNULL(isZc,'')= 'D' then '转厂离职' else '否' end 转厂, " +
" case when State = '0' then '在职' else '离职' end 状态, " +
" a.G_cy 人员性质, a.G_ygxz 用工性质, c.Name 计薪方式, d.Name 工种, a.G_zply 招聘途径, a.G_ 所属厂区, a.G_dkcq 打卡厂区, SUBSTRING(a.Memo, 1, CHARINDEX(',', a.Memo) - 1) 介绍人,e.Name 招聘来源, a.Memo 备注, " +
" LzDate 离职日期,'[' + whr + ']' + a.whrName 维护人,a.whrq 维护日期, a.photo 照片 " +
" from sys_tx_employee a " +
" left join sys_tx_kqSystem_dept b on a.Dept = b.deptID and a.company_FK = b.company_FK " +
" left join sys_tx_Jxfs c on a.Jxfs = c.Code " +
" left join sys_tx_GongZhong d on a.GongZhong = d.Code and(select kqSystem from sys_tx_kqSystem where company_FK = a.company_FK) = d.kqSystem " +
" left join sys_tx_zply e on replace(e.Code, ' ', '') = replace(SUBSTRING(a.Memo, CHARINDEX(',', a.Memo) + 1, len(a.Memo) - charindex(',', a.Memo)), ' ', '') " +
" where a.company_FK = '" + ddlRzgs.SelectedValue.ToString() + "' and convert(varchar(10), a.whrq, 120) = convert(varchar(10), getdate(), 120) order by a.whrq desc ";
DataTable dt;
if (!DB.AF.execSql(sql, sqlconn, out dt, out errMsg))
{
if (errMsg != "")
{
MessageBox.Show(errMsg, "错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
GV.DataSource = dt;
}
else if (ddlzc.SelectedValue.ToString() == "1")
{
MessageBox.Show("转厂成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
sql = " select a.companyName 公司,b.deptName 部门 ,userID 工号,userName 姓名,Pycounts 入职次数,Sfz 身份证号码,BornDate 出生日期,case when sex = '0' then '男' else '女' end 性别, " +
" PyDate 入职日期,case when IfDaKa = 1 then '是' else '否' end 打卡, Nation_Name 民族, HomeAddr 籍贯, " +
" case when ISNULL(isZc,'')= 'E' then '转厂入职' when ISNULL(isZc,'')= 'D' then '转厂离职' else '否' end 转厂, " +
" case when State = '0' then '在职' else '离职' end 状态, " +
" a.G_cy 人员性质, a.G_ygxz 用工性质, c.Name 计薪方式, d.Name 工种, a.G_zply 招聘途径, a.G_ 所属厂区, a.G_dkcq 打卡厂区, SUBSTRING(a.Memo, 1, CHARINDEX(',', a.Memo) - 1) 介绍人,e.Name 招聘来源, a.Memo 备注, " +
" LzDate 离职日期,'[' + whr + ']' + whrName 维护人,a.whrq 维护日期, photo 照片,G_sfzyxr 身份证生效日, G_sfzsxr 身份证失效日,G_fzjg 签发机关 " +
" from sys_tx_employee a " +
" left join sys_tx_kqSystem_dept b on a.Dept = b.deptID and a.company_FK = b.company_FK " +
" left join sys_tx_Jxfs c on a.Jxfs = c.Code " +
" left join sys_tx_GongZhong d on a.GongZhong = d.Code and(select kqSystem from sys_tx_kqSystem where company_FK = a.company_FK) = d.kqSystem " +
" left join sys_tx_zply e on replace(e.Code, ' ', '') = replace(SUBSTRING(a.Memo, CHARINDEX(',', a.Memo) + 1, len(a.Memo) - charindex(',', a.Memo)), ' ', '') " +
" where a.company_FK = '" + ddlRzgs.SelectedValue.ToString().Trim() + "' and convert(varchar(10), a.whrq, 120) = convert(varchar(10), getdate(), 120) and ISNULL(isZc,'') = 'E' order by a.whrq desc ";
DataTable dt;
if (!DB.AF.execSql(sql, sqlconn, out dt, out errMsg))
{
if (errMsg != "")
{
MessageBox.Show(errMsg, "错误:", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
GV.DataSource = dt;
}
GV.Columns[0].Visible = false;
GV.Columns[1].Visible = false;
GV.Columns["工种"].Visible = false;
GV.Columns["招聘来源"].Visible = false;
GV.Columns["计薪方式"].Visible = false;
tm.Stop();
btnReadCard.Text = "开始读卡";
txtRzrq.Text = DateTime.Now.ToShortDateString().ToString();
ddldept.Text = "";
btndept.Text = "";
deptId = "";
ddlDk.Text = "是";
ddlzc.Text = "否";
pictureBox1.Image = null;
ddljxfs.Text = "";
txtgzCode.Text = "";
txtgzName.Text = "";
ddlsscq.Text = "";
ddlDKArea.Text = "";
ddlPerXZ.Text = "";
ddlYGXZ.Text = "";
ddlZPTJ.Text = "";
txtjsr.Text = "";
}
}
else return;
}
#endregion
#region 工种
if (GV.Columns[e.ColumnIndex].Name == "btnd" && e.RowIndex != -1)
{
GongZhong gzForm = new GongZhong(this, "gv", e.RowIndex);
gzForm.gz(ddlRzgs.SelectedValue.ToString().Trim());
gzForm.ShowDialog();
return;
}
#endregion
}
catch (Exception ec)
{
MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
//这是我另一个窗体,值传过来之后先赋值给全局变量,因为别的地方要用到
public GongZhong(Form_employee_add fmz , string name,int row)
{
InitializeComponent();
fm = fmz;
flag = name;
rowNo = row;
}
//点击选择后把值写回原来的窗体
private void GV_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
if (GV.Columns[e.ColumnIndex].Name == "btnd" && e.RowIndex != -1 )
{
string Code, Name;
Code = GV.Rows[e.RowIndex].Cells[1].Value.ToString().Trim();
Name = GV.Rows[e.RowIndex].Cells[2].Value.ToString().Trim();
if (flag == "head")
{
fm.txtgzCode.Text = Code;
fm.txtgzName.Text = Name;
}
else if (flag == "gv")
{
fm.GV.Rows[rowNo].Cells["工种"].Value = Code;
}
this.Close();
return;
}
}
catch (Exception ec)
{
MessageBox.Show("错误:" + ec.StackTrace, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
- 单线程从Access数据库读取信息
public Thread threads;
public void getBarCodeData()
{
try
{
bz = 0;
string sqlAccess = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files (x86)\神思二代证\ssid.mdb";
OleDbConnection conn;
conn = new OleDbConnection(sqlAccess);
DataSet ds = new DataSet();
conn.Open();
string sql = "select * from citizen where isDK = 0 order by ID asc ";
OleDbDataAdapter oda = new OleDbDataAdapter(sql, conn);
OleDbCommandBuilder cb = new OleDbCommandBuilder(oda);
oda.UpdateCommand = cb.GetUpdateCommand();
oda.Fill(ds);
DataTable dt;
dt = ds.Tables[0];
for (int i = 0; i < dt.Rows.Count; i++)
{
string sqln = "select count(userID) as iszz from sys_tx_employee where State = 0 and Sfz= '" + dt.Rows[i]["IDCardNum"].ToString() + "'";
DataTable dtn;
if (!DB.AF.execSql(sqln, sqlconn, out dtn))
{
MessageBox.Show("获取员工在职信息失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (dtn.Rows[0]["iszz"].ToString() == "0")
{
GV.Columns[0].Visible = true;
string sqlPyCounts = "select COUNT(userID)+1 as PyCounts from sys_tx_employee where ISNULL(isZc,'N') in ('N','E') and Sfz= '" + dt.Rows[i]["IDCardNum"].ToString() + "'";
DataTable dtPyCounts;
if (!DB.AF.execSql(sqlPyCounts, sqlconn, out dtPyCounts))
{
MessageBox.Show("获取员工入职次数等信息失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
DataRow dr = sesstab.NewRow();
dr["身份证号"] = dt.Rows[i]["IDCardNum"].ToString();
dr["姓名"] = dt.Rows[i]["Name"].ToString();
dr["性别"] = dt.Rows[i]["sex"].ToString();
dr["民族"] = dt.Rows[i]["Folk"].ToString();
dr["出生日期"] = dt.Rows[i]["BirthDay"].ToString();
dr["住址/籍贯"] = dt.Rows[i]["Address"].ToString();
dr["签发机关"] = dt.Rows[i]["IssueOrgan"].ToString();
dr["有效期始"] = dt.Rows[i]["AvailabilityBegin"].ToString();
dr["有效期止"] = dt.Rows[i]["AvailabilityEnd"].ToString();
dr["入职次数"] = dtPyCounts.Rows[0]["PyCounts"].ToString();
dr["照片"] = dt.Rows[i]["Photo"];
if (GV.DataSource != null)
{
DataGridViewRow row = GV.Rows.Cast<DataGridViewRow>()
.FirstOrDefault(rd => rd.Cells[6].EditedFormattedValue.Equals(dt.Rows[i]["IDCardNum"].ToString()));
if (row != null) GV.Rows.Remove(row);
sesstab.Rows.InsertAt(dr, 0);
GV.Rows[0].Cells["计薪方式"].Value = ddljxfs.SelectedValue;
GV.Rows[0].Cells["工种"].Value = txtgzCode.Text;
GV.Rows[0].Cells["招聘来源"].Value = ddlzply.EditValue;
GV.Rows[0].Cells["介绍人"].Value = txtjsr.Text;
}
}
else if (dtn.Rows[0]["iszz"].ToString() == "1")
{
MessageBox.Show("该员工【" + dt.Rows[i]["Name"].ToString() + "】在HR系统为在职状态!不允许再次入职!");
}
else
{
MessageBox.Show("该员工【" + dt.Rows[i]["Name"].ToString() + "】在HR系统存在多条在职信息");
}
}
if (dt.Rows.Count != 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i]["isDK"] = -1;
}
oda.Update(dt);
ds.AcceptChanges();
}
conn.Close();
int r = dt.Rows.Count;
if (sesstab.Rows.Count > 0)
{
byte[] byteImage = (byte[])sesstab.Rows[0]["照片"];
MemoryStream ms = new MemoryStream(byteImage);
Bitmap bmpt = new Bitmap(ms);
pictureBox1.Image = bmpt;
}
Thread.Sleep(1000);
bz = 1;
return;
}
catch (Exception ec)
{
MessageBox.Show(ec.Message);
bz = 1;
return;
}
}
private void tm_Tick(object sender, EventArgs e)
{
tm.Stop();
if (bz == 1)
{
if (ddlzc.SelectedValue.ToString() == "0")
threads = new Thread(getBarCodeData);
else if (ddlzc.SelectedValue.ToString() == "1")
threads = new Thread(getBarCodeDataZC);
threads.IsBackground = true;
threads.Start();
}
tm.Start();
return;
}
private void btnbegin_Click(object sender, EventArgs e)
{
if (btnReadCard.Text == "开始读卡")
{
btnReadCard.Text = "结束读卡";
GV.Columns[0].Visible = true;
GV.Columns[1].Visible = true;
GV.Columns["工种"].Visible = true;
GV.Columns["招聘来源"].Visible = true;
GV.Columns["计薪方式"].Visible = true;
if (ddlzc.SelectedValue.ToString() == "0")
{
#region GV
GV.DataSource = null;
sesstab = new DataTable();
sesstab.Columns.Add("介绍人", typeof(string));
sesstab.Columns.Add("身份证号", typeof(string));
sesstab.Columns.Add("姓名", typeof(string));
sesstab.Columns.Add("性别", typeof(string));
sesstab.Columns.Add("民族", typeof(string));
sesstab.Columns.Add("出生日期", typeof(string));
sesstab.Columns.Add("住址/籍贯", typeof(string));
sesstab.Columns.Add("入职次数", typeof(string));
sesstab.Columns.Add("照片", typeof(System.Byte[]));
sesstab.Columns.Add("签发机关", typeof(string));
sesstab.Columns.Add("有效期始", typeof(string));
sesstab.Columns.Add("有效期止", typeof(string));
sesstab.Columns.Add("错误信息", typeof(string));
this.GV.DataSource = sesstab;
this.GV.EditMode = DataGridViewEditMode.EditOnEnter;
GV.Columns["身份证号"].Width = 180;
GV.Columns["姓名"].Width = 75;
GV.Columns["性别"].Width = 60;
GV.Columns["民族"].Width = 75;
GV.Columns["出生日期"].Width = 100;
GV.Columns["住址/籍贯"].Width = 260;
GV.Columns["入职次数"].Width = 90;
GV.Columns["照片"].Width = 100;
GV.Columns["签发机关"].Width = 100;
GV.Columns["有效期始"].Width = 100;
GV.Columns["有效期止"].Width = 100;
GV.Columns["错误信息"].Width = 300;
GV.Columns["身份证号"].ReadOnly = true;
GV.Columns["姓名"].ReadOnly = true;
GV.Columns["性别"].ReadOnly = true;
GV.Columns["民族"].ReadOnly = true;
GV.Columns["出生日期"].ReadOnly = true;
GV.Columns["住址/籍贯"].ReadOnly = true;
GV.Columns["入职次数"].ReadOnly = true;
GV.Columns["照片"].ReadOnly = true;
GV.Columns["签发机关"].ReadOnly = true;
GV.Columns["有效期始"].ReadOnly = true;
GV.Columns["有效期止"].ReadOnly = true;
GV.Columns["错误信息"].ReadOnly = true;
#endregion
bz = 1;
tm.Start();
}
else if (btnReadCard.Text == "结束读卡")
{
btnReadCard.Text = "开始读卡";
tm.Stop();
}
}
- Datagridview添加ComboBox列并赋值
赋值的在上面了,这边就贴一下添加ComboBox列的方法:
DataGridViewComboBoxColumn jxfs = new DataGridViewComboBoxColumn();
sql = "select Code,Name from sys_tx_Jxfs";
DataTable dtjxfs;
if (!DB.AF.execSql(sql, sqlconn, out dtjxfs))
{
return;
}
jxfs.Name = "计薪方式";
jxfs.DataSource = dtjxfs;
jxfs.ValueMember = "Code";
jxfs.DisplayMember = "Name";
2、员工返职
这块主要就一个知识点,就是一般GV添加超链接列都是添加一整列,没办法根据行项的值设置该超链接列是否显示。这里就是解决这个问题。主要思路很简单就是在数据库里查出符合条件的行项,做成一列,然后把这列变成超链接,我这个好像在别的文章里写过,这里就不贴代码了。