介紹兩個模塊:員工入職,和員工返職
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添加超鏈接列都是添加一整列,沒辦法根據行項的值設置該超鏈接列是否顯示。這裏就是解決這個問題。主要思路很簡單就是在數據庫裏查出符合條件的行項,做成一列,然後把這列變成超鏈接,我這個好像在別的文章裏寫過,這裏就不貼代碼了。