1069 lines
46 KiB
C#
1069 lines
46 KiB
C#
using AIMSExtension;
|
||
using Microsoft.Office.Interop.Excel;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows.Forms;
|
||
|
||
namespace AIMS.OperationFront.UI
|
||
{
|
||
public partial class frmPersonSchedulKeep : Form
|
||
{
|
||
|
||
private bool isDataLoaded = false;
|
||
private System.Data.DataTable dtDoctorNurses = null;
|
||
private System.Data.DataTable dtSchedulingType = null;
|
||
private System.Data.DataTable dtOverLackHours = null;
|
||
private System.Data.DataTable dtMainTable = null;
|
||
private System.Data.DataTable dtSchedulingNew = null;
|
||
|
||
private Dictionary<int, string> dicSchedulingTypeIdName = new Dictionary<int, string>();
|
||
private Dictionary<string, int> dicSchedulingTypeNameId = new Dictionary<string, int>();
|
||
|
||
private GPDbHelper dbHelper = new GPDbHelper();
|
||
public frmPersonSchedulKeep()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 由班次Id获取班次名称
|
||
/// </summary>
|
||
/// <param name="id">班次Id</param>
|
||
/// <returns></returns>
|
||
private string getSchedulingTypeName(int id)
|
||
{
|
||
if (dicSchedulingTypeIdName.ContainsKey(id))
|
||
{
|
||
return dicSchedulingTypeIdName[id];
|
||
}
|
||
return "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 由班次名称获取班次Id
|
||
/// </summary>
|
||
/// <param name="name">班次名称</param>
|
||
/// <returns></returns>
|
||
private int getSchedulingTypeId(string name)
|
||
{
|
||
if (dicSchedulingTypeNameId.ContainsKey(name))
|
||
{
|
||
return dicSchedulingTypeNameId[name];
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 字符串数组加空项
|
||
/// </summary>
|
||
/// <param name="items">字符串数组</param>
|
||
/// <returns></returns>
|
||
private string[] ArrayAddEmptyValue(string[] items)
|
||
{
|
||
int n = items.Length;
|
||
string[] items2 = new string[n + 1];
|
||
items2[0] = "";
|
||
Array.Copy(items, 0, items2, 1, n);
|
||
return items2;
|
||
}
|
||
|
||
private void FrmDeptAttendance_Load(object sender, EventArgs e)
|
||
{
|
||
//dbHelper = new GPDbHelper();
|
||
//this.dataGridView1.RowPostPaint += GPControls.DataGridView_RowPostPaint;
|
||
GetMainDataTable();
|
||
this.WindowState = FormWindowState.Maximized;
|
||
this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 结构时间(小时 分钟)
|
||
/// </summary>
|
||
struct MyHourMinute
|
||
{
|
||
public int hour;
|
||
public int minute;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 上下班时间
|
||
/// </summary>
|
||
struct MySxbTime
|
||
{
|
||
public DateTime sbTime;
|
||
public DateTime xbTime;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 由时间字符串解析出结构时间
|
||
/// </summary>
|
||
/// <param name="time">时间字符串</param>
|
||
/// <returns></returns>
|
||
private MyHourMinute GetMyHourMinute(string time)
|
||
{
|
||
MyHourMinute hm;
|
||
hm.hour = -1; /*不正确的时间表示*/
|
||
hm.minute = 0;
|
||
if (string.IsNullOrEmpty(time)) return hm;
|
||
int[] arr = GPFunctions.StringToIntArray(time, ':');
|
||
if (arr.Length == 2)
|
||
{
|
||
hm.minute = arr[1];
|
||
}
|
||
hm.hour = arr[0];
|
||
return hm;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 由上下班时间字符串解析出上下班时间
|
||
/// </summary>
|
||
/// <param name="beginTime">上班时间字符</param>
|
||
/// <param name="endTime">下班时间字符</param>
|
||
/// <returns></returns>
|
||
private MySxbTime GetMySxbTime(string beginTime, string endTime)
|
||
{
|
||
/*获取上下班时间, 如果下班时间早于上班时间,则无效*/
|
||
MySxbTime sxbTime;
|
||
DateTime dateTime = this.dateTimePicker1.Value.Date;
|
||
if (string.IsNullOrEmpty(beginTime) || string.IsNullOrEmpty(endTime))
|
||
{
|
||
sxbTime.sbTime = dateTime;
|
||
sxbTime.xbTime = dateTime.AddDays(-1);
|
||
return sxbTime;
|
||
}
|
||
|
||
MyHourMinute hm = GetMyHourMinute(beginTime);
|
||
sxbTime.sbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
|
||
hm = GetMyHourMinute(endTime);
|
||
sxbTime.xbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
|
||
if (sxbTime.xbTime.CompareTo(sxbTime.sbTime) <= 0)
|
||
{
|
||
sxbTime.xbTime = sxbTime.xbTime.AddDays(1);
|
||
}
|
||
return sxbTime;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取主显示表数据
|
||
/// </summary>
|
||
private void GetMainDataTable()
|
||
{
|
||
if (dtMainTable != null)
|
||
{
|
||
if (GPFunData.GetDataTableChangedCount(dtMainTable) > 0)
|
||
{
|
||
if (MessageBox.Show("数据有修改,没有保存,是否要保存?", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes)
|
||
{
|
||
SaveData();
|
||
}
|
||
}
|
||
}
|
||
|
||
isDataLoaded = false;
|
||
DateTime dateTime = this.dateTimePicker1.Value.Date;
|
||
int year = dateTime.Year;
|
||
int month = dateTime.Month;
|
||
int day = dateTime.Day;
|
||
string sql;
|
||
/*读取手术麻醉科的医生WorkersType=2护士信息 WorkersType=*/
|
||
|
||
if (chxInvalidWorker.Checked)
|
||
{
|
||
if (radioDoctor.Checked)
|
||
{
|
||
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' order by w.[PersonOrder] ";
|
||
}
|
||
else
|
||
{
|
||
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' order by w.[PersonOrder] ";
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
if (radioDoctor.Checked)
|
||
{
|
||
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' and w.IsValid=1 order by w.[PersonOrder] ";
|
||
}
|
||
else
|
||
{
|
||
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' and w.IsValid=1 order by w.[PersonOrder] ";
|
||
}
|
||
|
||
}
|
||
dtDoctorNurses = dbHelper.GetDataTable(sql);
|
||
|
||
sql = "select Id, [Name], BeginTime, EndTime from SchedulingType";
|
||
dtSchedulingType = dbHelper.GetDataTable(sql);
|
||
|
||
dicSchedulingTypeIdName.Clear();
|
||
dicSchedulingTypeNameId.Clear();
|
||
foreach (DataRow dr in dtSchedulingType.Rows)
|
||
{
|
||
int id = (int)dr["Id"];
|
||
string name = dr["Name"].ToString();
|
||
dicSchedulingTypeIdName[id] = name;
|
||
dicSchedulingTypeNameId[name] = id;
|
||
}
|
||
|
||
DataGridView dgv = this.dataGridView1;
|
||
dgv.AutoGenerateColumns = false;
|
||
|
||
sql = string.Format("SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime));
|
||
dtOverLackHours = dbHelper.GetDataTable(sql);
|
||
|
||
sql = string.Format("select Id, WorkerId, SchedulingDate, SchedulingType from SchedulingNew where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime));
|
||
dtSchedulingNew = dbHelper.GetDataTable(sql);
|
||
|
||
DataView dvWorkers = dtDoctorNurses.DefaultView;
|
||
DataView dvOverLackHours = dtOverLackHours.DefaultView;
|
||
DataView dvSchedulingNew = dtSchedulingNew.DefaultView;
|
||
DataView dvSchedulingType = dtSchedulingType.DefaultView;
|
||
|
||
System.Data.DataTable dataTable = dtOverLackHours.Clone();
|
||
dataTable.Columns.Add("SchedulingTypeName", typeof(string));
|
||
dataTable.Columns.Add("WorkNo", typeof(string));
|
||
dataTable.Columns.Add("HCode", typeof(string));
|
||
dataTable.Columns.Add("Name", typeof(string));
|
||
dataTable.Columns.Add("RoleName", typeof(string));
|
||
dataTable.Columns.Add("BeginTime2", typeof(DateTime));
|
||
dataTable.Columns.Add("EndTime2", typeof(DateTime));
|
||
|
||
bool isNurse = radioNurse.Checked;
|
||
if (!isNurse)
|
||
{
|
||
dvWorkers.RowFilter = "WorkersType=2";
|
||
}
|
||
else
|
||
{
|
||
dvWorkers.RowFilter = "WorkersType=1";
|
||
}
|
||
dvWorkers.Sort = "OrderBy";
|
||
|
||
int n = dvWorkers.Count;
|
||
for (int i = 0; i < n; i++)
|
||
{
|
||
DataRow dr = dataTable.NewRow();
|
||
DataRowView dvr = dvWorkers[i];
|
||
/*WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2*/
|
||
int workerId = (int)dvr["id"];
|
||
int workersType = (int)dvr["WorkersType"];
|
||
int SchedulingTypeId = 0;
|
||
string beginTime, endTime;
|
||
MySxbTime sxbTime;
|
||
dr["WorkerId"] = (int)dvr["Id"];
|
||
dr["WorkersType"] = workersType;
|
||
dr["WorkNo"] = dvr["WorkNo"].ToString();
|
||
dr["Name"] = dvr["Name"].ToString();
|
||
dr["HCode"] = dvr["HCode"].ToString();
|
||
dr["RoleName"] = (workersType == 2 ? "医生" : "护士");
|
||
dr["SchedulingDate"] = dateTime;
|
||
|
||
dvOverLackHours.RowFilter = string.Format("WorkerId={0}", workerId);
|
||
if (dvOverLackHours.Count > 0)
|
||
{
|
||
SchedulingTypeId = GPFunctions.CInt(dvOverLackHours[0]["SchedulingTypeId"]);
|
||
dr["SchedulingTypeId"] = SchedulingTypeId;
|
||
if (SchedulingTypeId > 0)
|
||
{
|
||
dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId);
|
||
beginTime = dvOverLackHours[0]["BeginTime"].ToString();
|
||
endTime = dvOverLackHours[0]["EndTime"].ToString();
|
||
dr["BeginTime"] = beginTime;
|
||
dr["EndTime"] = endTime;
|
||
sxbTime = GetMySxbTime(beginTime, endTime);
|
||
if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) < 0)
|
||
{
|
||
dr["BeginTime2"] = sxbTime.sbTime;
|
||
dr["EndTime2"] = sxbTime.xbTime;
|
||
}
|
||
}
|
||
|
||
dr["OverHours"] = dvOverLackHours[0]["OverHours"];
|
||
dr["LackHours"] = dvOverLackHours[0]["LackHours"];
|
||
dr["OverTime1"] = dvOverLackHours[0]["OverTime1"];
|
||
dr["OverTime2"] = dvOverLackHours[0]["OverTime2"];
|
||
dr["LackTime1"] = dvOverLackHours[0]["LackTime1"];
|
||
dr["LackTime2"] = dvOverLackHours[0]["LackTime2"];
|
||
}
|
||
else
|
||
{
|
||
dvSchedulingNew.RowFilter = string.Format("WorkerId={0}", workerId);
|
||
if (dvSchedulingNew.Count > 0)
|
||
{
|
||
SchedulingTypeId = (int)dvSchedulingNew[0]["SchedulingType"];
|
||
dr["SchedulingTypeId"] = SchedulingTypeId;
|
||
dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId);
|
||
dvSchedulingType.RowFilter = string.Format("Id={0}", SchedulingTypeId);
|
||
if (dvSchedulingType.Count > 0)
|
||
{
|
||
beginTime = dvSchedulingType[0]["beginTime"].ToString();
|
||
endTime = dvSchedulingType[0]["endTime"].ToString();
|
||
dr["BeginTime"] = beginTime;
|
||
dr["EndTime"] = endTime;
|
||
sxbTime = GetMySxbTime(beginTime, endTime);
|
||
dr["BeginTime2"] = sxbTime.sbTime;
|
||
dr["EndTime2"] = sxbTime.xbTime;
|
||
dr["OverTime1"] = sxbTime.xbTime;
|
||
dr["OverTime2"] = sxbTime.xbTime;
|
||
dr["LackTime1"] = sxbTime.xbTime;
|
||
dr["LackTime2"] = sxbTime.xbTime;
|
||
}
|
||
}
|
||
}
|
||
dataTable.Rows.Add(dr);
|
||
}
|
||
dataTable.AcceptChanges();
|
||
this.dataGridView1.DataSource = dataTable;
|
||
|
||
dtMainTable = dataTable;
|
||
DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" });
|
||
isDataLoaded = true;
|
||
}
|
||
|
||
private void btnExit_Click(object sender, EventArgs e)
|
||
{
|
||
this.Close();
|
||
}
|
||
|
||
private void button1_Click(object sender, EventArgs e)
|
||
{
|
||
ExportToExcel(string.Format("{0}考勤缺勤表.xls", this.dateTimePicker1.Value.ToString("yyyy-MM-dd")), this.dataGridView1);
|
||
}
|
||
|
||
private void textFind_TextChanged(object sender, EventArgs e)
|
||
{
|
||
string text = textFind.Text.Trim();
|
||
dtMainTable.DefaultView.RowFilter = string.Format("WorkNo like '%{0}%' or Name like '%{0}%' or HCode like '%{0}%' ", text);
|
||
}
|
||
|
||
private void radioDoctor_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
GetMainDataTable();
|
||
}
|
||
|
||
private void radioNurse_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
GetMainDataTable();
|
||
}
|
||
|
||
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
GetMainDataTable();
|
||
}
|
||
|
||
private void chxInvalidWorker_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
GetMainDataTable();
|
||
}
|
||
|
||
private void btnFresh_Click(object sender, EventArgs e)
|
||
{
|
||
GetMainDataTable();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 显示汇总数据
|
||
/// </summary>
|
||
/// <param name="fieldname">汇总字段列表</param>
|
||
/// <param name="displayname">汇总字段显示标题</param>
|
||
private void DisplayTotalInfo(string[] fieldname, string[] displayname)
|
||
{
|
||
int n = fieldname.Length;
|
||
decimal[] num = new decimal[n];
|
||
DataRowCollection rows = dtMainTable.Rows;
|
||
for (int i = 0, m = rows.Count; i < m; i++)
|
||
{
|
||
for (int j = 0; j < n; j++)
|
||
{
|
||
num[j] += GPFunctions.CDecimal(rows[i][fieldname[j]]);
|
||
}
|
||
}
|
||
StringBuilder sb = new StringBuilder();
|
||
for (int k = 0; k < n; k++)
|
||
{
|
||
sb.Append(string.Format("{0}: {1} ", displayname[k], num[k]));
|
||
}
|
||
|
||
labelTotal.Text = sb.ToString();
|
||
}
|
||
|
||
|
||
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
|
||
{
|
||
/*表格值修改时*/
|
||
if (!isDataLoaded) return;
|
||
DataGridView dgv = this.dataGridView1;
|
||
int rowIndex = e.RowIndex;
|
||
int colIndex = e.ColumnIndex;
|
||
string columnName = dgv.Columns[colIndex].Name;
|
||
if (string.IsNullOrEmpty(columnName)) return;
|
||
|
||
dgv.CellValueChanged -= dataGridView1_CellValueChanged;
|
||
double dblValue;
|
||
decimal overHours, lackHours;
|
||
DateTime t1, t2;
|
||
bool ischanged = false;
|
||
DataGridViewRow dvr = dgv.Rows[rowIndex];
|
||
DateTime dateTime = this.dateTimePicker1.Value.Date;
|
||
MySxbTime sxbTime;
|
||
TimeSpan ts;
|
||
|
||
switch (columnName)
|
||
{
|
||
case "SchedulingTypeName":
|
||
/*班次调为不可编辑 2020-01-10*/
|
||
//intValue = getSchedulingTypeId(dvr.Cells[colIndex].Value.ToString());
|
||
//DataView dv = dtSchedulingType.DefaultView;
|
||
//dv.RowFilter = string.Format("id={0}", intValue);
|
||
//if (dv.Count > 0)
|
||
//{
|
||
// beginTime = dv[0]["BeginTime"].ToString();
|
||
// endTime = dv[0]["EndTime"].ToString();
|
||
// dvr.Cells["SchedulingTypeId"].Value = intValue;
|
||
// dvr.Cells["BeginTime"].Value = beginTime;
|
||
// dvr.Cells["endTime"].Value = endTime;
|
||
|
||
// hm = GetMyHourMinute(beginTime);
|
||
// t1 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
|
||
// dvr.Cells["OverTime1"].Value = t1;
|
||
// dvr.Cells["OverTime2"].Value = t1;
|
||
// hm = GetMyHourMinute(endTime);
|
||
// t2 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
|
||
// dvr.Cells["LackTime1"].Value = t2;
|
||
// dvr.Cells["LackTime2"].Value = t2;
|
||
//}
|
||
//dgv.EndEdit();
|
||
break;
|
||
case "OverHours":
|
||
/*输入加班时数,加班时数应当正数,如果是负数或者0, 就自动调整为空值。
|
||
如果存在加班起点,就直接计算加班终点,如果不存在加班起点(说明无班次),就以18点做为加班起点,计算加班终点。*/
|
||
overHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value);
|
||
if (overHours <= 0)
|
||
{
|
||
if (overHours < 0) MessageBox.Show(string.Format("加班时数({0}),请输入非负数。", overHours), "提示信息");
|
||
dvr.Cells["OverHours"].Value = DBNull.Value;
|
||
dvr.Cells["OverTime2"].Value = dvr.Cells["OverTime1"].Value;
|
||
}
|
||
else
|
||
{
|
||
if (dvr.Cells["OverTime1"].Value == DBNull.Value)
|
||
{
|
||
t1 = dateTime.AddHours(18);
|
||
dvr.Cells["OverTime1"].Value = t1;
|
||
}
|
||
else
|
||
{
|
||
t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value);
|
||
}
|
||
dvr.Cells["OverTime2"].Value = t1.AddMinutes((double)overHours * 60);
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
case "LackHours":
|
||
/*输入缺勤时数,如果存在缺勤终点,就直接计算缺勤起点,如果不存在缺勤终点(说明无班次),就以18点做为终点,计算缺勤起点*/
|
||
lackHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value);
|
||
if (lackHours <= 0)
|
||
{
|
||
if (lackHours < 0) MessageBox.Show(string.Format("缺勤时数({0}),请输入非负数。", lackHours), "提示信息");
|
||
dvr.Cells["LackHours"].Value = DBNull.Value;
|
||
dvr.Cells["OverTime1"].Value = dvr.Cells["OverTime2"].Value;
|
||
}
|
||
else
|
||
{
|
||
if (dvr.Cells["LackTime2"].Value == DBNull.Value)
|
||
{
|
||
t2 = dateTime.AddHours(18);
|
||
dvr.Cells["LackTime2"].Value = t2;
|
||
}
|
||
else
|
||
{
|
||
t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value);
|
||
}
|
||
dblValue = 0 - GPFunctions.CDbl(lackHours) * 60;
|
||
dvr.Cells["LackTime1"].Value = t2.AddMinutes(dblValue);
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
case "Overtime1":
|
||
/*输入加班起点时间,如果存在加班小时数,就计算终点时间。
|
||
如果不存在加班小时数,存在加班终点,且加班终点大于起点,就计算加班小时数,加班终点不大于起点, 将加班终点时设为加班起点,加班时数为空。*/
|
||
t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
|
||
t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute);
|
||
dvr.Cells["OverTime1"].Value = t1;
|
||
|
||
overHours = GPFunctions.CDecimal(dvr.Cells["OverHours"].Value);
|
||
if (overHours.CompareTo(0) > 0)
|
||
{
|
||
t2 = t1.AddMinutes((double)overHours * 60);
|
||
dvr.Cells["OverTime2"].Value = t2;
|
||
}
|
||
else
|
||
{
|
||
if (dvr.Cells["OverTime2"].Value == DBNull.Value)
|
||
{
|
||
dvr.Cells["OverTime2"].Value = t1;
|
||
dvr.Cells["OverHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
t2 = GPFunctions.CDate(dvr.Cells["OverTime2"].Value);
|
||
if (t2.CompareTo(t1) > 0)
|
||
{
|
||
ts = t2 - t1;
|
||
overHours = GPFunctions.CDecimal(ts.TotalHours);
|
||
dvr.Cells["OverHours"].Value = overHours;
|
||
}
|
||
else
|
||
{
|
||
dvr.Cells["OverTime2"].Value = t1;
|
||
dvr.Cells["OverHours"].Value = DBNull.Value;
|
||
}
|
||
}
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
case "Overtime2":
|
||
/*输入加班终点时间,如果存在加班起点,就计算加班小时数。
|
||
如果不存在加班起点(也一定不存在加班小时数),将加班起点时设为加班终点,加班时数为空。*/
|
||
t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
|
||
t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute);
|
||
sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value);
|
||
if (t2.CompareTo(sxbTime.sbTime) < 0)
|
||
{
|
||
t2 = t2.AddDays(1);
|
||
}
|
||
dvr.Cells["OverTime2"].Value = t2;
|
||
|
||
if (dvr.Cells["OverTime1"].Value == DBNull.Value)
|
||
{
|
||
dvr.Cells["OverTime1"].Value = t2;
|
||
dvr.Cells["OverHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value);
|
||
if (t2.CompareTo(t1) <= 0)
|
||
{
|
||
dvr.Cells["OverTime2"].Value = t1;
|
||
dvr.Cells["OverHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
ts = t2 - t1;
|
||
overHours = GPFunctions.CDecimal(ts.TotalHours);
|
||
dvr.Cells["OverHours"].Value = overHours;
|
||
}
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
case "LackTime1":
|
||
/*输入缺勤起点时间,如果存在缺勤终点,就计算缺勤小时数。如果不存在缺勤终点(缺勤小时数也一定不存在),将缺勤终点设为缺勤起点,缺勤小时数为空。*/
|
||
t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
|
||
t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute);
|
||
dvr.Cells["LackTime1"].Value = t1;
|
||
|
||
if (dvr.Cells["LackTime2"].Value == DBNull.Value)
|
||
{
|
||
dvr.Cells["LackTime2"].Value = t1;
|
||
dvr.Cells["LackHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value);
|
||
if (t2.CompareTo(t1) <= 0)
|
||
{
|
||
dvr.Cells["LackTime2"].Value = t1;
|
||
dvr.Cells["LackHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
ts = t2 - t1;
|
||
lackHours = GPFunctions.CDecimal(ts.TotalHours);
|
||
dvr.Cells["LackHours"].Value = lackHours;
|
||
}
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
case "LackTime2":
|
||
/*输入缺勤终点时间,如果存在缺勤小时数,就计算缺勤起点。 如果不存在缺勤小时数,存在缺勤起点,就计算缺勤小时数。如果不存在缺勤起点(缺勤小时数也一定不存在),将缺勤起点设为缺勤终点,缺勤小时数为空。*/
|
||
t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
|
||
t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute);
|
||
sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value);
|
||
if (t2.CompareTo(sxbTime.sbTime) < 0) t2 = t2.AddDays(1);
|
||
dvr.Cells["LackTime2"].Value = t2;
|
||
|
||
lackHours = GPFunctions.CDecimal(dvr.Cells["LackHours"].Value);
|
||
if (lackHours.CompareTo(0) > 0)
|
||
{
|
||
t1 = t2.AddMinutes((double)lackHours * (-1) * 60);
|
||
dvr.Cells["LackTime1"].Value = t1;
|
||
}
|
||
else
|
||
{
|
||
if (dvr.Cells["LackTime1"].Value == DBNull.Value)
|
||
{
|
||
dvr.Cells["LackHours"].Value = DBNull.Value;
|
||
dvr.Cells["LackTime1"].Value = t2;
|
||
}
|
||
else
|
||
{
|
||
t1 = GPFunctions.CDate(dvr.Cells["LackTime1"].Value);
|
||
if (t2.CompareTo(t1) <= 0)
|
||
{
|
||
dvr.Cells["LackTime1"].Value = t2;
|
||
dvr.Cells["LackHours"].Value = DBNull.Value;
|
||
}
|
||
else
|
||
{
|
||
ts = t2 - t1;
|
||
lackHours = GPFunctions.CDecimal(ts.TotalHours);
|
||
dvr.Cells["LackHours"].Value = lackHours;
|
||
}
|
||
|
||
}
|
||
}
|
||
ischanged = true;
|
||
dgv.EndEdit();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
if (ischanged)
|
||
{
|
||
DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" });
|
||
}
|
||
dgv.CellValueChanged += dataGridView1_CellValueChanged;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存数据
|
||
/// </summary>
|
||
private void SaveData()
|
||
{
|
||
|
||
System.Data.DataTable dataTable = dtMainTable.Clone();
|
||
int n = dtMainTable.Rows.Count;
|
||
string[] columns = new string[] { "WorkerId", "SchedulingDate", "WorkersType", "SchedulingTypeId", "BeginTime", "EndTime", "OverHours", "LackHours", "OverTime1", "OverTime2", "LackTime1", "LackTime2" };
|
||
for (int i = 0; i < n; i++)
|
||
{
|
||
DataRow dr, dr2;
|
||
dr = dtMainTable.Rows[i];
|
||
int overHours = GPFunctions.CInt(dr["OverHours"]);
|
||
int lackHours = GPFunctions.CInt(dr["LackHours"]);
|
||
if (overHours > 0 || lackHours > 0)
|
||
{
|
||
dr2 = dataTable.NewRow();
|
||
GPFunData.CopyDataRow(dr, dr2, columns);
|
||
dataTable.Rows.Add(dr2);
|
||
}
|
||
}
|
||
n = dataTable.Rows.Count;
|
||
if (n == 0) return;
|
||
|
||
DateTime dateTime = Convert.ToDateTime(dataTable.Rows[0]["SchedulingDate"]);
|
||
try
|
||
{
|
||
dbHelper.BeginTransaction();
|
||
n = dbHelper.Execute(string.Format("delete ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime)));
|
||
n = dbHelper.DataTableSave(dataTable, "SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours");
|
||
dbHelper.Commit();
|
||
dtMainTable.AcceptChanges();
|
||
MessageBox.Show("保存成功。", "提示信息");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
dbHelper.RollBack();
|
||
MessageBox.Show("保存失败:" + ex.Message, "提示信息");
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查数据的合理性
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private bool CheckData()
|
||
{
|
||
bool isOverChecked = chxOverTime.Checked;
|
||
bool isLackChecked = chxLackTime.Checked;
|
||
if ((!isOverChecked) && (!isLackChecked)) return true;
|
||
|
||
DataGridView dgv = this.dataGridView1;
|
||
int rowCount = dgv.Rows.Count;
|
||
bool isok = true;
|
||
for (int i = 0; i < rowCount; i++)
|
||
{
|
||
int overHours, lackHours;
|
||
MySxbTime sxbTime;
|
||
DateTime overTime1, overTime2, lackTime1, lackTime2;
|
||
DataGridViewCellCollection cells = dgv.Rows[i].Cells;
|
||
sxbTime.sbTime = GPFunctions.CDate(cells["BeginTime2"].Value);
|
||
sxbTime.xbTime = GPFunctions.CDate(cells["EndTime2"].Value);
|
||
|
||
if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
/*检查加班时间*/
|
||
if (isOverChecked)
|
||
{
|
||
overHours = GPFunctions.CInt(cells["OverHours"].Value);
|
||
if (overHours > 0)
|
||
{
|
||
overTime1 = GPFunctions.CDate(cells["OverTime1"].Value);
|
||
overTime2 = GPFunctions.CDate(cells["OverTime2"].Value);
|
||
if (overTime1.CompareTo(sxbTime.sbTime) >= 0 && overTime1.CompareTo(sxbTime.xbTime) < 0)
|
||
{
|
||
MessageBox.Show("加班起点不能在上下班时间内。", "提示信息");
|
||
dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"];
|
||
isok = false;
|
||
break;
|
||
}
|
||
if (overTime2.CompareTo(sxbTime.sbTime) > 0 && overTime2.CompareTo(sxbTime.xbTime) <= 0)
|
||
{
|
||
dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"];
|
||
MessageBox.Show("加班终点不能在上下班时间内。", "提示信息");
|
||
isok = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*检查加班时间*/
|
||
if (isLackChecked)
|
||
{
|
||
lackHours = GPFunctions.CInt(cells["LackHours"].Value);
|
||
if (lackHours > 0)
|
||
{
|
||
lackTime1 = GPFunctions.CDate(cells["LackTime1"].Value);
|
||
lackTime2 = GPFunctions.CDate(cells["LackTime2"].Value);
|
||
if (lackTime1.CompareTo(sxbTime.sbTime) <= 0 || lackTime1.CompareTo(sxbTime.xbTime) > 0)
|
||
{
|
||
dgv.CurrentCell = dgv.Rows[i].Cells["LackTime1"];
|
||
MessageBox.Show("缺勤起点不能在上下班时间外。", "提示信息");
|
||
isok = false;
|
||
break;
|
||
}
|
||
|
||
if (lackTime2.CompareTo(sxbTime.sbTime) < 0 || lackTime2.CompareTo(sxbTime.xbTime) > 0)
|
||
{
|
||
dgv.CurrentCell = dgv.Rows[i].Cells["LackTime2"];
|
||
MessageBox.Show("缺勤终点不能在上下班时间外。", "提示信息");
|
||
isok = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return isok;
|
||
}
|
||
|
||
private void btnSave_Click(object sender, EventArgs e)
|
||
{
|
||
/*保存数据*/
|
||
if (!CheckData())
|
||
{
|
||
return;
|
||
}
|
||
SaveData();
|
||
}
|
||
|
||
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
|
||
{
|
||
|
||
}
|
||
|
||
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
|
||
{
|
||
DataGridView dgv = this.dataGridView1;
|
||
int rowIndex = e.RowIndex;
|
||
int colIndex = e.ColumnIndex;
|
||
string columnName = dgv.Columns[colIndex].Name;
|
||
if (string.IsNullOrEmpty(columnName)) return;
|
||
DateTime t, dateTime;
|
||
dateTime = this.dateTimePicker1.Value.Date;
|
||
switch (columnName)
|
||
{
|
||
case "Overtime1":
|
||
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
|
||
if (t.CompareTo(dateTime) < 0)
|
||
{
|
||
t = dateTime;
|
||
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
|
||
}
|
||
break;
|
||
case "Overtime2":
|
||
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
|
||
if (t.CompareTo(dateTime) < 0)
|
||
{
|
||
t = dateTime;
|
||
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
|
||
}
|
||
break;
|
||
case "LackTime1":
|
||
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
|
||
if (t.CompareTo(dateTime) < 0)
|
||
{
|
||
t = dateTime;
|
||
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
|
||
}
|
||
break;
|
||
case "LackTime2":
|
||
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
|
||
if (t.CompareTo(dateTime) < 0)
|
||
{
|
||
t = dateTime;
|
||
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
private void btnPrint_Click(object sender, EventArgs e)
|
||
{
|
||
/*打印出缺勤表*/
|
||
DateTime dateTime = this.dateTimePicker1.Value;
|
||
int year = dateTime.Year;
|
||
int month = dateTime.Month;
|
||
DateTime monthFirstDay = new DateTime(year, month, 1);
|
||
DateTime nextMonthFirstDay = monthFirstDay.AddMonths(1);
|
||
int dayMax = nextMonthFirstDay.AddDays(-1).Day;
|
||
|
||
string sql = string.Format("SELECT a.WorkerId, w.[Name], Day(a.SchedulingDate) as [Day], a.WorkersType, a.OverHours, a.LackHours FROM ScheduleOverLackHours a inner join Person w on a.WorkerId = w.id WHERE SchedulingDate >= '{0}' AND SchedulingDate<'{1}' order by WorkersType desc, w.PersonOrder, [Day]", GPFunctions.DateStr(monthFirstDay), GPFunctions.DateStr(nextMonthFirstDay));
|
||
System.Data.DataTable dataTable = dbHelper.GetDataTable(sql);
|
||
|
||
GoldPrinter.ExcelAccess excel = new GoldPrinter.ExcelAccess();
|
||
excel.IsVisibledExcel = false;
|
||
string filepath = string.Format("{0}\\Template\\职工出缺勤表.xlt", System.Windows.Forms.Application.StartupPath);
|
||
excel.Open(filepath);
|
||
Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.Workbooks.ActiveSheet;
|
||
string strTitle;
|
||
strTitle = PublicMethod.HospitalName + "职工出(缺)勤表";
|
||
excel.SetCellText(1, "A", strTitle);
|
||
excel.SetCellText(2, "E", string.Format("{0} 年 {1} 月", year, month));
|
||
int rowsCount = dataTable.Rows.Count;
|
||
decimal sumOverHours = 0, sumLackHours = 0;
|
||
int prewWorkId = 0;
|
||
int workerNumber = 0;
|
||
int rowsNumber = 0;
|
||
Microsoft.Office.Interop.Excel.Range range;
|
||
switch (dayMax)
|
||
{
|
||
case 30:
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0;
|
||
break;
|
||
case 29:
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0;
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0;
|
||
break;
|
||
case 28:
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0;
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0;
|
||
((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 31]).EntireColumn.ColumnWidth = 0;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
for (int i = 0; i < rowsCount; i++)
|
||
{
|
||
decimal overHours, lackHours;
|
||
DataRow dr = dataTable.Rows[i];
|
||
|
||
int workerId = Convert.ToInt32(dr["WorkerId"]);
|
||
int day = Convert.ToInt32(dr["Day"]);
|
||
overHours = GPFunctions.CDecimal(dr["OverHours"]);
|
||
lackHours = GPFunctions.CDecimal(dr["LackHours"]);
|
||
|
||
if (workerId == prewWorkId)
|
||
{
|
||
sumOverHours += overHours;
|
||
sumLackHours += lackHours;
|
||
}
|
||
else
|
||
{
|
||
/*合并姓名单元格, 填入名称*/
|
||
workerNumber++;
|
||
rowsNumber = 4 + (workerNumber - 1) * 2;
|
||
range = xlSheet.Range[xlSheet.Cells[rowsNumber, 1], xlSheet.Cells[rowsNumber + 1, 1]];
|
||
range.Merge(System.Reflection.Missing.Value);
|
||
xlSheet.Cells[rowsNumber, 1] = dr["Name"].ToString();
|
||
|
||
xlSheet.Cells[rowsNumber, 2] = "加班";
|
||
xlSheet.Cells[rowsNumber + 1, 2] = "缺勤";
|
||
|
||
range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber + 1, "AI"]];
|
||
range.Merge(System.Reflection.Missing.Value);
|
||
|
||
/*设置缺勤行字体颜色*/
|
||
rowsNumber = rowsNumber + 1;
|
||
range = xlSheet.Range[xlSheet.Cells[rowsNumber, 2], xlSheet.Cells[rowsNumber, 34]];
|
||
range.Font.Color = Color.Red; //红色
|
||
|
||
if (workerNumber > 1)
|
||
{
|
||
/*填写上一个职工行的合计数*/
|
||
rowsNumber = 4 + (workerNumber - 2) * 2;
|
||
if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours;
|
||
if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours;
|
||
|
||
/*合并累计单元格*/
|
||
xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours;
|
||
if (sumOverHours - sumLackHours < 0)
|
||
{
|
||
/*累计小于0,红色显示*/
|
||
range.Font.Color = Color.Red; //红色
|
||
}
|
||
}
|
||
sumOverHours = overHours;
|
||
sumLackHours = lackHours;
|
||
|
||
prewWorkId = workerId;
|
||
}
|
||
/*填入加班和缺勤缺勤小时数*/
|
||
rowsNumber = 4 + (workerNumber - 1) * 2;
|
||
if (overHours > 0) xlSheet.Cells[rowsNumber, 2 + day] = overHours;
|
||
if (lackHours > 0) xlSheet.Cells[rowsNumber + 1, 2 + day] = lackHours;
|
||
|
||
System.Windows.Forms.Application.DoEvents();
|
||
}
|
||
|
||
if (workerNumber > 0)
|
||
{
|
||
/*填写最后一个职工行的合计数*/
|
||
rowsNumber = 4 + (workerNumber - 1) * 2;
|
||
if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours;
|
||
if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours;
|
||
xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours;
|
||
if (sumOverHours - sumLackHours < 0)
|
||
{
|
||
/*累计小于0,红色显示*/
|
||
range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber, "AI"]];
|
||
range.Font.Color = Color.Red; //红色
|
||
}
|
||
}
|
||
excel.PrintPreview();
|
||
excel.Close();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导出Excel
|
||
/// </summary>
|
||
/// <param name="fileName">文件路径</param>
|
||
/// <param name="myDGV">控件DataGridView</param>
|
||
public static void ExportToExcel(string fileName, DataGridView gridView, int[] excludeColcumns = null)
|
||
{
|
||
int rowsCount = gridView.Rows.Count;
|
||
if (rowsCount == 0)
|
||
{
|
||
MessageBox.Show("没有数据", "提示信息");
|
||
return;
|
||
}
|
||
string saveFileName = "";
|
||
SaveFileDialog saveDialog = new SaveFileDialog();
|
||
saveDialog.DefaultExt = "xls";
|
||
saveDialog.Filter = "Excel文件|*.xls";
|
||
saveDialog.FileName = fileName;
|
||
saveDialog.ShowDialog();
|
||
saveFileName = saveDialog.FileName;
|
||
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
|
||
if (saveFileName == "") return;
|
||
|
||
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
|
||
if (xlApp == null)
|
||
{
|
||
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
|
||
return;
|
||
}
|
||
Workbooks workbooks = xlApp.Workbooks;
|
||
Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
|
||
|
||
//取得sheet1
|
||
Worksheet worksheet = (Worksheet)workbook.ActiveSheet;
|
||
//写入标题
|
||
int colLen = gridView.ColumnCount;
|
||
List<MyIntInt> list = new List<MyIntInt>();
|
||
for (int i = 0; i < colLen; i++)
|
||
{
|
||
bool isok = gridView.Columns[i].Visible;
|
||
MyIntInt o;
|
||
if (isok)
|
||
{
|
||
if (excludeColcumns != null)
|
||
{
|
||
if (Array.IndexOf(excludeColcumns, i) >= 0)
|
||
{
|
||
isok = false;
|
||
}
|
||
}
|
||
}
|
||
if (isok)
|
||
{
|
||
o = new MyIntInt();
|
||
o.Key = i;
|
||
o.Val = gridView.Columns[i].Width;
|
||
list.Add(o);
|
||
}
|
||
}
|
||
|
||
int col = 0;
|
||
foreach (MyIntInt o in list)
|
||
{
|
||
col++;
|
||
worksheet.Cells[1, col] = gridView.Columns[o.Key].HeaderText;
|
||
Microsoft.Office.Interop.Excel.Range range = worksheet.Range[worksheet.Cells[1, col], worksheet.Cells[1, col]];
|
||
range.ColumnWidth = o.Val > 200 ? 200 : o.Val;
|
||
}
|
||
|
||
//写入数值
|
||
for (int r = 0, n = rowsCount; r < n; r++)
|
||
{
|
||
col = 0;
|
||
foreach (MyIntInt o in list)
|
||
{
|
||
col++;
|
||
worksheet.Cells[r + 2, col] = gridView.Rows[r].Cells[o.Key].Value;
|
||
}
|
||
System.Windows.Forms.Application.DoEvents();
|
||
}
|
||
|
||
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
|
||
try
|
||
{
|
||
workbook.Saved = true;
|
||
workbook.SaveCopyAs(saveFileName);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message, "提示信息");
|
||
}
|
||
xlApp.Quit();
|
||
GC.Collect();//强行销毁
|
||
MessageBox.Show("文件: " + saveFileName + " 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||
}
|
||
}
|
||
|
||
public class MyIntInt
|
||
{
|
||
public int Key { get; set; }
|
||
|
||
public int Val { get; set; }
|
||
}
|
||
}
|