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; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; using UAS_MES_NEW.PublicMethod; namespace UAS_MES_NEW.Make { public partial class Make_MakeCancelDown : Form { AutoSizeFormClass asc = new AutoSizeFormClass(); DataTable dt; DataTable dt1; DataTable dtbar; LogStringBuilder sql = new LogStringBuilder(); DataHelper dh; public Make_MakeCancelDown() { InitializeComponent(); } private void Make_MakeCancelDown_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); md_code_rb.Focus(); //ChooseAllButton 内部用私有字段记录「是否已全选」,累加新行后无法复位其状态; //公共控件不允许改动,故本界面不再调用 ChooseAll(dgv)(避免挂上控件自带的 Click), //改为挂本界面自己的切换式全选处理。 ChooseAll.Click += ChooseAll_Click; dh = SystemInf.dh; } //是否已全选:累加新行后需要复位,否则会出现「按钮写着全选、其实已经全选过」的错位 private bool _allChecked = false; /// /// 全选/取消全选(切换式):点击时若已全部勾选则全部取消,否则全部勾选 /// 只改复选框状态,不触发数据刷新 /// private void ChooseAll_Click(object sender, EventArgs e) { if (LabelDataGridView.Rows.Count == 0) { OperateResult.AppendText(">>当前没有可勾选的下地记录\n", Color.Red); return; } bool setValue = !_allChecked; for (int i = 0; i < LabelDataGridView.Rows.Count; i++) { LabelDataGridView.Rows[i].Cells["Choose"].Value = setValue; } //只改 cell value 时复选框显示可能不刷新 LabelDataGridView.RefreshEdit(); _allChecked = setValue; ChooseAll.Text = setValue ? "取消全选" : "全选"; choosenum.Text = setValue ? LabelDataGridView.Rows.Count.ToString() : "0"; OperateResult.AppendText(setValue ? ">>已全选当前列表\n" : ">>已取消全选\n", Color.Black); } private void Make_MakeCancelDown_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } private void md_code_rb_Click(object sender, EventArgs e) { if (((RadioButton)sender).Checked == true) { if (((RadioButton)sender).Name == "md_code_rb") { BaseUtil.CleanForm(this); inputreson.Text = ""; mdcode.Enabled = true; sn_code.Enabled = false; mdcode.Focus(); } else if (((RadioButton)sender).Name == "sn_code_rb") { BaseUtil.CleanForm(this); inputreson.Text = ""; sn_code.Enabled = true; mdcode.Enabled = false; sn_code.Focus(); } //切换模式会清空列表,全选按钮状态同步复位 ResetChooseAllState(); } } /// /// 复位「全选」按钮的内部状态与文案(列表被清空/重建后必须调用, /// 否则会出现按钮写着「取消全选」但实际一个都没勾的错位) /// private void ResetChooseAllState() { _allChecked = false; ChooseAll.Text = "全选"; } private void md_code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (dh.CheckExist("MakeDown", "md_code = '" + mdcode.Text + "'")) { sql.Clear(); sql.Append("select md_code,md_sncode,md_macode,md_prodcode,pr_detail from makedown left join product on pr_code=md_prodcode where md_code='" + mdcode.Text + "' and md_status=-1"); dt1 = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dt1.Rows.Count > 0) { BaseUtil.FillDgvWithDataTable(LabelDataGridView, dt1); } else { OperateResult.AppendText(">>事件号" + mdcode.Text + "无未取消下地的数据\n", Color.Red); BaseUtil.CleanDGVData(LabelDataGridView); } sum.Text = dt1.Rows.Count.ToString(); make_count.Text = dt1.Rows.Count.ToString(); //列表被整表重建,全选按钮状态复位 ResetChooseAllState(); choosenum.Text = "0"; } else { OperateResult.AppendText(">>事件号" + mdcode.Text + "不存在\n", Color.Red); } } } private void sn_code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { string sn = sn_code.Text.Trim(); if (sn == "") { return; } //累加前先查库:只有存在未取消下地的记录才加进列表(保留原有卡控) sql.Clear(); sql.Append("select md_code,md_sncode,md_macode,md_prodcode,pr_detail from makedown left join product on pr_code=md_prodcode where md_sncode='" + sn + "' and md_status=-1"); dtbar = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dtbar.Rows.Count == 0) { OperateResult.AppendText(">>序列号" + sn + "无未取消下地的数据\n", Color.Red); sn_code.Clear(); sn_code.Focus(); return; } //同一序列号已在列表中则跳过,避免重复取消下地 if (ExistsSnInGrid(sn)) { OperateResult.AppendText(">>序列号" + sn + "已在列表中,不重复添加\n", Color.Red); sn_code.Clear(); sn_code.Focus(); return; } //把本次扫描到的记录累加到DGV中(保留原有列:工单编号/序列号/产品代码/产品名称/事件号) //注意:事件号模式用过 FillDgvWithDataTable 后 DGV 还挂着 DataSource, //此时 Rows.Add() 会抛 InvalidOperationException,故先解绑定再手工加行 if (LabelDataGridView.DataSource != null) { LabelDataGridView.DataSource = null; LabelDataGridView.Rows.Clear(); } for (int i = 0; i < dtbar.Rows.Count; i++) { int idx = LabelDataGridView.Rows.Add(); DataGridViewRow row = LabelDataGridView.Rows[idx]; row.Cells["md_macode"].Value = dtbar.Rows[i]["md_macode"].ToString(); row.Cells["md_sncode"].Value = dtbar.Rows[i]["md_sncode"].ToString(); row.Cells["md_prodcode"].Value = dtbar.Rows[i]["md_prodcode"].ToString(); row.Cells["pr_detail"].Value = dtbar.Rows[i]["pr_detail"].ToString(); row.Cells["md_code"].Value = dtbar.Rows[i]["md_code"].ToString(); //新累加的行默认不勾选,由用户自己勾选或点「全选」 row.Cells["Choose"].Value = false; } OperateResult.AppendText(">>序列号" + sn + "已累加,当前共" + LabelDataGridView.Rows.Count + "条\n", Color.Black); //累加后新行未勾选,把全选按钮拉回「未全选」状态,避免与界面显示错位 _allChecked = false; sum.Text = LabelDataGridView.Rows.Count.ToString(); choosenum.Text = "0"; sn_code.Clear(); sn_code.Focus(); } } /// /// 判断指定的序列号是否已存在于DGV列表中 /// private bool ExistsSnInGrid(string sn) { for (int i = 0; i < LabelDataGridView.Rows.Count; i++) { if (LabelDataGridView.Rows[i].Cells["md_sncode"].Value != null && LabelDataGridView.Rows[i].Cells["md_sncode"].Value.ToString() == sn) { return true; } } return false; } private void Sure_Click(object sender, EventArgs e) { if (inputreson.Text.Trim() != "") { Boolean cancle = false; Boolean haveclick = false; //本次处理的取消下地成功数量(SN模式下一个SN可能对应多行,按行统计) int doneCount = 0; for (int i = 0; i < LabelDataGridView.Rows.Count; i++) { if (LabelDataGridView.Rows[i].Cells["Choose"].Value != null) { if ((Boolean)LabelDataGridView.Rows[i].Cells["Choose"].Value == true) { haveclick = true; } } } if (!haveclick) { OperateResult.AppendText(">>>没有勾选下地记录\n", Color.Red); return; } for (int i = 0; i < LabelDataGridView.Rows.Count; i++) { if (LabelDataGridView.Rows[i].Cells["Choose"].Value != null) { if ((Boolean)LabelDataGridView.Rows[i].Cells["Choose"].Value == true) { //更新取消下地原因 dh.UpdateByCondition("makedown", "md_status=0,MD_UPREASON='" + inputreson.Text + "', MD_UPDATE=sysdate, MD_UPMAN='" + User.UserCode + "' ", " md_code = '" + LabelDataGridView.Rows[i].Cells["md_code"].Value.ToString() + "' and md_sncode = '" + LabelDataGridView.Rows[i].Cells["md_sncode"].Value.ToString() + "'"); //更新序列号状态 sql.Clear(); sql.Append("update makeserial set ms_downstatus=0 where ms_sncode='" + LabelDataGridView.Rows[i].Cells["md_sncode"].Value.ToString() + "' and ms_makecode='" + LabelDataGridView.Rows[i].Cells["md_macode"].Value.ToString() + "'"); dh.ExecuteSql(sql.GetString(), "update"); LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, LabelDataGridView.Rows[i].Cells["md_macode"].Value.ToString(), User.UserLineCode, User.UserSourceCode, "取消下地操作", "序列号" + LabelDataGridView.Rows[i].Cells["md_sncode"].Value.ToString() + "下地成功", LabelDataGridView.Rows[i].Cells["md_sncode"].Value.ToString(), ""); doneCount++; } } } if (sn_code.Enabled) { //SN模式:列表是累加出来的,确认后整表清空,提示本次成功条数 OperateResult.AppendText(">>>本次取消下地成功" + doneCount + "条,已清空列表\n", Color.Green); sn_code.Text = ""; sn_code.Focus(); inputreson.Text = ""; sum.Text = ""; choosenum.Text = ""; BaseUtil.CleanDGVData(LabelDataGridView); ResetChooseAllState(); } else if (mdcode.Enabled) { sum.Text = ""; choosenum.Text = ""; OperateResult.AppendText(">>>事件号" + mdcode.Text + "取消下地成功\n", Color.Green); mdcode.Focus(); md_code_KeyDown(sender, new KeyEventArgs(Keys.Enter)); } } else { OperateResult.AppendText(">>>没有填写取消下地原因\n", Color.Red); return; } } //已选数据更新 private void LabelDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { int choosecount = 0; for (int i = 0; i < LabelDataGridView.Rows.Count; i++) { if (LabelDataGridView.Rows[i].Cells["Choose"].Value != null) { if ((Boolean)LabelDataGridView.Rows[i].Cells["Choose"].Value == true) { choosecount++; } } } choosenum.Text = choosecount.ToString(); } //勾选框更改提交 private void LabelDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (LabelDataGridView.IsCurrentCellDirty) { LabelDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); } } } }