using ComponentFactory.Krypton.Toolkit; using NXWMS.Client.FrmCustom; using NXWMS.Client.Model.AppModels.Condition.Common; using NXWMS.Client.Model.AppModels.Result.Common; using NXWMS.Client.Model.AppModels.Result.Instock; using NXWMS.Client.Model.CoreModels; using NXWMS.Commons; using NXWMS.Services; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web.UI.WebControls; using System.Windows.Forms; using static NXWMS.Client.FrmCustom.CustomEventMsg; namespace NXWMS.Forms.Instock.frmInstockChild { /// /// 编辑收货单窗体类 /// public partial class frmChildEditWmsInReceipt : KryptonForm { /// /// 窗体构造函数 /// public frmChildEditWmsInReceipt() { InitializeComponent(); } #region 全局变量 /// /// 收货单主键 /// public string ReceiptId { get; set; } /// /// 到货通知单号 /// public string ArrivalNo { get; set; } /// /// 数据库中的收货单所有数据(包括主、明细表)。 /// 未进行编辑过。 /// private WmsInReceiptResult ReceiptDataNotEdit = new WmsInReceiptResult(); List lstArrivalDtl = new List(); /// /// 模板地址 /// private string _reportFolder = Application.StartupPath + "\\ReportMd\\"; #endregion #region 初始化数据 /// /// 窗体加载函数 /// /// /// private void frmChildEditWmsInReceipt_Load(object sender, EventArgs e) { InitComboBoxItemData(); InitDataGridViewColumn(); kdtp_ReceiptTime.Checked = false; LoadWmsInReceiptDtlData(); } /// /// 初始化下拉列表数据 /// private void InitComboBoxItemData() { /* ToDo:后续把下拉列表转为 后台获取数据,目前是写死的。 1:WMS人工创建;2:到货通知单导入;3:手持端创建;4:接口导入;5:Excel导入。 */ List results = new List(); #region 单据类型 results = BasDictionaryUtil.basDictionaryResultLst.FindAll(x => x.DICTIONARY_CODE == "ReceiptTypeDesc"); if (results.Count > 0) { kcmb_ReceiptType.Items.Clear(); foreach (var item in results) { kcmb_ReceiptType.Items.Add(new ListItem { Value = item.DICTIONARY_ITEM_CODE, Text = item.DICTIONARY_ITEM_NAME, }); } kcmb_ReceiptType.SelectedIndex = 0; } else { KryptonMessageBox.Show("未找到收货单类型的字典项数据!"); } #endregion } DataTable dt; /// /// 初始化DataGridView列信息 /// private void InitDataGridViewColumn() { DataGridViewColumn column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "序号"; column1.Width = 50; column1.ReadOnly = true; kdgv_ReceiptDtlData.Columns.Add(column1); dt = CreateTable(); DataGridViewColumn column = new DataGridViewDataWindowColumn(); (column as DataGridViewDataWindowColumn).SDisplayField = "到货通知单明细ID,物料编码,物料名称,物料条码,物料类型编码,物料类型名称"; (column as DataGridViewDataWindowColumn).SDisplayMember = "物料编码"; (column as DataGridViewDataWindowColumn).SKeyWords = "物料编码"; (column as DataGridViewDataWindowColumn).DataSource = dt; column.Width = 150; column.HeaderText = "物料编码"; kdgv_ReceiptDtlData.Columns.Add(column); column = new DataGridViewDataWindowColumn(); (column as DataGridViewDataWindowColumn).SDisplayField = "到货通知单明细ID,物料编码,物料名称,物料条码,物料类型编码,物料类型名称"; (column as DataGridViewDataWindowColumn).SDisplayMember = "物料名称"; (column as DataGridViewDataWindowColumn).SKeyWords = "物料名称"; (column as DataGridViewDataWindowColumn).DataSource = dt; column.HeaderText = "物料名称"; column.Width = 200; kdgv_ReceiptDtlData.Columns.Add(column); column = new DataGridViewDataWindowColumn(); (column as DataGridViewDataWindowColumn).SDisplayField = "到货通知单明细ID,物料编码,物料名称,物料条码,物料类型编码,物料类型名称"; (column as DataGridViewDataWindowColumn).SDisplayMember = "物料条码"; (column as DataGridViewDataWindowColumn).SKeyWords = "物料条码"; (column as DataGridViewDataWindowColumn).DataSource = dt; column.HeaderText = "物料条码"; column.Width = 150; kdgv_ReceiptDtlData.Columns.Add(column); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "批次号"; column1.Width = 120; kdgv_ReceiptDtlData.Columns.Add(column1); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "到货单明细未收货数量"; column1.Width = 150; kdgv_ReceiptDtlData.Columns.Add(column1); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "收货单明细数量"; column1.Width = 100; kdgv_ReceiptDtlData.Columns.Add(column1); DataGridViewComboBoxColumn cmb_Unit = new DataGridViewComboBoxColumn(); cmb_Unit.HeaderText = "单位"; cmb_Unit.Width = 70; //目前写死下拉列表的数据项,后续改为后台获取 cmb_Unit.Items.AddRange(new ListItem[] { new ListItem{ Value = "kg",Text = "千克"}, new ListItem{ Value = "ge",Text = "个"}, new ListItem{ Value = "pkg",Text = "箱"} }); cmb_Unit.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; kdgv_ReceiptDtlData.Columns.Add(cmb_Unit); DataGridViewComboBoxColumn cmb_Supplier = new DataGridViewComboBoxColumn(); cmb_Supplier.HeaderText = "供应商"; cmb_Supplier.Width = 120; //目前写死下拉列表的数据项,后续改为后台获取 cmb_Supplier.Items.AddRange(new ListItem[] { new ListItem{ Value ="WX_NXZB_001" ,Text = "无锡南兴装备"}, new ListItem{ Value ="WX_NXZB_002" ,Text = "东莞南兴装备"} }); cmb_Supplier.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; kdgv_ReceiptDtlData.Columns.Add(cmb_Supplier); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "包装"; column1.Width = 80; kdgv_ReceiptDtlData.Columns.Add(column1); KryptonDataGridViewDateTimePickerColumn column_ProductTime = new KryptonDataGridViewDateTimePickerColumn(); column_ProductTime.HeaderText = "生产日期"; column_ProductTime.Width = 160; column_ProductTime.Format = DateTimePickerFormat.Custom; column_ProductTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; kdgv_ReceiptDtlData.Columns.Add(column_ProductTime); KryptonDataGridViewDateTimePickerColumn column_ExpTime = new KryptonDataGridViewDateTimePickerColumn(); column_ExpTime.HeaderText = "失效日期"; column_ExpTime.Width = 160; column_ExpTime.Format = DateTimePickerFormat.Custom; column_ExpTime.CustomFormat = "yyyy-MM-dd HH:mm:ss"; kdgv_ReceiptDtlData.Columns.Add(column_ExpTime); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = ""; column1.Width = 30; column1.Visible = false; kdgv_ReceiptDtlData.Columns.Add(column1); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "到货单明细ID"; column1.Width = 120; //column1.Visible = false; kdgv_ReceiptDtlData.Columns.Add(column1); column1 = new KryptonDataGridViewTextBoxColumn(); column1.HeaderText = "到货数量"; column1.Width = 30; column1.Visible = false; kdgv_ReceiptDtlData.Columns.Add(column1); } /// /// 创建数据源表格 /// /// private DataTable CreateTable() { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("到货通知单明细ID"); dt.Columns.Add(dc); dc = new DataColumn("物料编码"); dt.Columns.Add(dc); dc = new DataColumn("物料名称"); dt.Columns.Add(dc); dc = new DataColumn("物料条码"); dt.Columns.Add(dc); dc = new DataColumn("物料类型编码"); dt.Columns.Add(dc); dc = new DataColumn("物料类型名称"); dt.Columns.Add(dc); if (string.IsNullOrEmpty(this.ArrivalNo)) { var result = WmsInstockService.materielMsgForAddArrivalService.GetMaterielMsgForAddArrival(); if (result.Status == OperateStatus.Success) { foreach (MaterielMsgForAddArrivalResult item in result.Data) { DataRow dr = dt.NewRow(); dr["物料编码"] = item.MATERIEL_CODE; dr["物料名称"] = item.MATERIEL_NAME; dr["物料条码"] = item.MATERIEL_BARCODE; dr["物料类型编码"] = item.MATERIEL_TYPE_CODE; dr["物料类型名称"] = item.MATERIEL_TYPE_NAME; dr["到货通知单明细ID"] = 0; dt.Rows.Add(dr); } lstArrivalDtl.Clear(); } } else { var result = WmsInstockService.wmsInArrivalService.GetWmsInArrivalDtlDataForNo(new WmsInArrivalResult { ARRIVAL_NO = this.ArrivalNo, REMARKS1 = "编辑收货单" }); if (result.Status == OperateStatus.Success) { foreach (WmsInArrivalDtlResult item in result.Data) { if (item.RECEIPT_QTY < item.ARRIVAL_QTY) { DataRow dr = dt.NewRow(); dr["物料编码"] = item.MATERIEL_CODE; dr["物料名称"] = item.MATERIEL_NAME; dr["物料条码"] = item.MATERIEL_BARCODE; dr["物料类型编码"] = item.MATERIEL_TYPE_CODE; dr["物料类型名称"] = item.MATERIEL_TYPE_NAME; dr["到货通知单明细ID"] = item.ARRIVAL_DTL_ID; dt.Rows.Add(dr); } } lstArrivalDtl.Clear(); lstArrivalDtl = result.Data; } } return dt; } /// /// 调用服务端接口,请求收货单明细表数据 /// /// private string LoadWmsInReceiptDtlData() { var result = WmsInstockService.wmsInReceiptService.GetWmsInReceiptDtlListForId(new WmsInReceiptResult { RECEIPT_ID = Convert.ToInt32(this.ReceiptId) }); if (result.Status == OperateStatus.Success) { ktb_ArrivalNo.Text = result.Data.ARRIVAL_NO; ktb_ArrivalNo.Enabled = false; ktb_Receipter.Text = result.Data.RECEIPTER; ktb_Receipter.Enabled = true; kcmb_ReceiptType.Text = result.Data.RECEIPT_TYPE_NAME; kcmb_ReceiptType.Enabled = false; ktb_Describe.Text = result.Data.DESCRIBE; if (result.Data.RECEIPT_TIME != new DateTime()) { kdtp_ReceiptTime.Value = result.Data.RECEIPT_TIME; kdtp_ReceiptTime.Enabled = false; } ReceiptDataNotEdit = result.Data; kdgv_ReceiptDtlData.Rows.Clear(); foreach (WmsInReceiptDtlResult item in result.Data.WmsInReceiptDtlList) { int index = kdgv_ReceiptDtlData.Rows.Add(); kdgv_ReceiptDtlData.Rows[index].Cells[0].Value = index + 1; kdgv_ReceiptDtlData.Rows[index].Cells[1].Value = item.MATERIEL_CODE; kdgv_ReceiptDtlData.Rows[index].Cells[2].Value = item.MATERIEL_NAME; kdgv_ReceiptDtlData.Rows[index].Cells[3].Value = item.MATERIEL_BARCODE; kdgv_ReceiptDtlData.Rows[index].Cells[4].Value = item.BATCH_NO; WmsInArrivalDtlResult arrDtlMd = lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == item.ARRIVAL_DTL_ID); if (arrDtlMd != null && ktb_ArrivalNo.Text != null) { kdgv_ReceiptDtlData.Rows[index].Cells[5].Value = arrDtlMd.ARRIVAL_QTY - arrDtlMd.RECEIPT_QTY; } else { kdgv_ReceiptDtlData.Rows[index].Cells[5].Value = 0; } kdgv_ReceiptDtlData.Rows[index].Cells[6].Value = item.RECEIPT_DTL_QTY; ListItem unitLstItm = GetComboBoxItem((DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[index].Cells[7], item.UNIT_CODE); kdgv_ReceiptDtlData.Rows[index].Cells[7].Value = unitLstItm; ListItem supplierLstItm = GetComboBoxItem((DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[index].Cells[8], item.SUPPLIER_CODE); kdgv_ReceiptDtlData.Rows[index].Cells[8].Value = supplierLstItm; kdgv_ReceiptDtlData.Rows[index].Cells[9].Value = item.PACKAGE_CODE; kdgv_ReceiptDtlData.Rows[index].Cells[10].Value = item.PRODUCT_DATE; kdgv_ReceiptDtlData.Rows[index].Cells[11].Value = item.EXP_DATE; kdgv_ReceiptDtlData.Rows[index].Cells[12].Value = item.RECEIPT_DTL_ID; kdgv_ReceiptDtlData.Rows[index].Cells[13].Value = item.ARRIVAL_DTL_ID; kdgv_ReceiptDtlData.Rows[index].Cells[14].Value = item.ARRIVAL_QTY; } return string.Empty; } else { return result.Message; } } #endregion #region 按钮事件 /// /// 取消按钮事件 /// 退出编辑页面 /// /// /// private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } /// /// 确认按钮事件 /// 提交收货单数据 /// /// /// private void btnConfirm_Click(object sender, EventArgs e) { WmsInReceiptResult mdReceipt = new WmsInReceiptResult(); mdReceipt.RECEIPT_ID = ReceiptDataNotEdit.RECEIPT_ID; mdReceipt.RECEIPT_NO = ReceiptDataNotEdit.RECEIPT_NO; mdReceipt.ARRIVAL_NO = ktb_ArrivalNo.Text.Trim(); mdReceipt.RECEIPT_TYPE = kcmb_ReceiptType.SelectedIndex + 1; mdReceipt.RECEIPT_TYPE_NAME = kcmb_ReceiptType.Text; mdReceipt.RECEIPTER = ktb_Receipter.Text.Trim(); if (kdtp_ReceiptTime.Checked) { mdReceipt.RECEIPT_TIME = kdtp_ReceiptTime.Value; } else { mdReceipt.RECEIPT_TIME = new DateTime(); } mdReceipt.RECEIPT_STATUS = ReceiptDataNotEdit.RECEIPT_STATUS; mdReceipt.DESCRIBE = ktb_Describe.Text.Trim(); mdReceipt.CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId; mdReceipt.UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId; List mdReceiptDtlList = new List(); if (kdgv_ReceiptDtlData.Rows.Count > 0 && !kdgv_ReceiptDtlData.Rows[0].IsNewRow) { foreach (DataGridViewRow dvr in kdgv_ReceiptDtlData.Rows) { if (!dvr.IsNewRow) { #region 校验每一行数据的完整性 string RowCheckMsg = string.Empty; if (!CheckDataGridViewRowFormat(dvr, ref RowCheckMsg)) { KryptonMessageBox.Show(RowCheckMsg); return; } #endregion string materielCode = dvr.Cells[1].Value.ToString(); string materielName = dvr.Cells[2].Value.ToString(); string materielBarcode = dvr.Cells[3].Value == null ? null : dvr.Cells[3].Value.ToString(); string batchNo = dvr.Cells[4].Value == null ? null : dvr.Cells[4].Value.ToString(); decimal arrivalQty = dvr.Cells[14].Value == null ? 0 : Convert.ToDecimal(dvr.Cells[14].Value.ToString()); decimal receiptDtlQty = Convert.ToDecimal(dvr.Cells[6].Value); string unitCode = GetComboBoxItem((DataGridViewComboBoxCell)dvr.Cells[7]).Value; string supplierCode = GetComboBoxItem((DataGridViewComboBoxCell)dvr.Cells[8]).Value; string supplierName = GetComboBoxItem((DataGridViewComboBoxCell)dvr.Cells[8]).Text; string packageCode = dvr.Cells[9].Value == null ? null : dvr.Cells[9].Value.ToString(); DateTime productTime = Convert.ToDateTime(dvr.Cells[10].Value); DateTime expTime = Convert.ToDateTime(dvr.Cells[11].Value); int receiptDtlId = dvr.Cells[12].Value == null ? 0 : Convert.ToInt32(dvr.Cells[12].Value); int arrivalDtlId = dvr.Cells[13].Value == null ? 0 : Convert.ToInt32(dvr.Cells[13].Value); mdReceiptDtlList.Add(new WmsInReceiptDtlResult { RECEIPT_DTL_ID = receiptDtlId, MATERIEL_CODE = materielCode, MATERIEL_NAME = materielName, MATERIEL_BARCODE = materielBarcode, BATCH_NO = batchNo, ARRIVAL_QTY = arrivalQty, RECEIPT_DTL_QTY = receiptDtlQty, UNIT_CODE = unitCode, SUPPLIER_CODE = supplierCode, SUPPLIER_NAME = supplierName, PACKAGE_CODE = packageCode, PRODUCT_DATE = productTime, EXP_DATE = expTime, CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId, UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId, DESCRIBE = null, ARRIVAL_DTL_ID = arrivalDtlId }); } } #region 校验明细行 不能存在相同批次、物料条码的数据行 var strList = mdReceiptDtlList.GroupBy(x => new { x.MATERIEL_CODE, x.BATCH_NO, x.ARRIVAL_DTL_ID }).Select(x => new { Key = x.Count(), MATERIEL_CODE = x.Key.MATERIEL_CODE, BATCH_NO = x.Key.BATCH_NO, ARRIVAL_DTL_ID = x.Key.ARRIVAL_DTL_ID }).ToList(); foreach (var item in strList) { if (item.Key > 1) { KryptonMessageBox.Show($"相同的物料:【{item.MATERIEL_CODE}】,批次号:【{item.BATCH_NO}】到货单明细行:【{item.ARRIVAL_DTL_ID}】只能添加一行收货数据,请修正输入数据行!"); return; } } #endregion List finalReceiptDtlList = new List(); foreach (WmsInReceiptDtlResult itemOld in ReceiptDataNotEdit.WmsInReceiptDtlList) { WmsInReceiptDtlResult receiptDtlNew = mdReceiptDtlList.Find(x => x.RECEIPT_DTL_ID == itemOld.RECEIPT_DTL_ID); if (receiptDtlNew != null) { receiptDtlNew.RECEIPT_DTL_STATUS = itemOld.RECEIPT_DTL_STATUS; receiptDtlNew.REMARKS1 = "更新"; finalReceiptDtlList.Add(receiptDtlNew); } else { itemOld.RECEIPT_DTL_STATUS = (int)ReceiptStatus.已删除; itemOld.REMARKS1 = "删除"; finalReceiptDtlList.Add(itemOld); } } foreach (WmsInReceiptDtlResult itemNew in mdReceiptDtlList) { if (itemNew.RECEIPT_DTL_ID == 0) { itemNew.REMARKS1 = "添加"; finalReceiptDtlList.Add(itemNew); } } mdReceipt.WmsInReceiptDtlList = finalReceiptDtlList; var result = WmsInstockService.wmsInReceiptService.EditWmsInReceiptData(mdReceipt); if (result.Status == OperateStatus.Success) { KryptonMessageBox.Show(result.Message); frmWmsInReceipt.RefreshFrmHost(); this.Close(); } else { KryptonMessageBox.Show(result.Message); } } else { DialogResult dr = KryptonMessageBox.Show("由于明细为空,确定要删除收货单所有数据吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dr == DialogResult.OK) { var result = WmsInstockService.wmsInReceiptService.DeleteWmsInReceiptData(new WmsInReceiptResult { RECEIPT_NO = ReceiptDataNotEdit.RECEIPT_ID.ToString(), UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId }); if (result.Status == OperateStatus.Success) { KryptonMessageBox.Show(result.Message); frmWmsInReceipt.RefreshFrmHost(); this.Close(); } else { KryptonMessageBox.Show(result.Message); } } } } private ListItem GetComboBoxItem(DataGridViewComboBoxCell dataGridViewComboBoxCell) { foreach (var item in dataGridViewComboBoxCell.Items) { if (((ListItem)item).Text == dataGridViewComboBoxCell.Value.ToString()) { return (ListItem)item; } } return new ListItem(); } private ListItem GetComboBoxItem(DataGridViewComboBoxCell dataGridViewComboBoxCell, string value) { foreach (var item in dataGridViewComboBoxCell.Items) { if (((ListItem)item).Value == value) { return (ListItem)item; } } return new ListItem(); } /// /// 校验DataGridView输入行数据的正确性 /// /// DataGridView输入行 /// 校验结果信息 /// private bool CheckDataGridViewRowFormat(DataGridViewRow dvr, ref string OutMssg) { if (dvr.Cells[1].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入物料编码!"; return false; } if (dvr.Cells[2].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入物料名称!"; return false; } if (dvr.Cells[6].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入收货明细数量!"; return false; } else { if (!Regex.IsMatch(dvr.Cells[6].Value.ToString(), @"([1-9]\d*(\.\d*[1-9])?)")) { OutMssg = $"第【{dvr.Index + 1}】行输入的收货明细数量不是合法的数字类型,请检查!"; return false; } else { if (!string.IsNullOrEmpty(ktb_ArrivalNo.Text)) { decimal receiptDtlQty = Convert.ToDecimal(dvr.Cells[6].Value); decimal ArrivalDtlQty_NoReceipt = Convert.ToDecimal(dvr.Cells[5].Value); if (receiptDtlQty > ArrivalDtlQty_NoReceipt && ArrivalDtlQty_NoReceipt > 0) { OutMssg = $"第【{dvr.Index + 1}】行输入的收货明细数量大于到货单明细未收货数量,请修改收货明细数量!"; return false; } } } } if (dvr.Cells[7].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未选择单位信息!"; return false; } if (dvr.Cells[8].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未选择供应商信息!"; return false; } if (dvr.Cells[10].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入生产日期!"; return false; } if (dvr.Cells[11].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入失效日期!"; return false; } if (DateTime.Compare(Convert.ToDateTime(dvr.Cells[10].Value), Convert.ToDateTime(dvr.Cells[11].Value)) >= 0) { OutMssg = $"第【{dvr.Index + 1}】行未输入的生产日期大于失效日期,不符合实际情况,请重新输入!"; return false; } OutMssg = "校验成功!"; return true; } #endregion #region DataGridView相关的事件 /// /// 编辑单元格控件时触发的事件 /// /// /// private void kdgv_ReceiptDtlData_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewOfComoBoxCustom) { (e.Control as DataGridViewOfComoBoxCustom).AfterSelector -= new AfterSelectorEventHandler(SalePageAddOrEditForm_AfterSelector); (e.Control as DataGridViewOfComoBoxCustom).AfterSelector += new AfterSelectorEventHandler(SalePageAddOrEditForm_AfterSelector); } } /// /// 针对ComboBox下拉列表的DataGridView数据列单元格。 /// 由于DataGridView的ComboBox列的Item至使用的是KeyValue形式的ListItem, /// 并且单元格刚开始进入编辑的时候,value值为null。如果后续不选择下拉列表的值,就切换编辑的单元格,就会触发DataError事件,警告数据格式错误。 /// 所以单元格刚开始进入编辑的时候。需要设定一个默认值。默认值的类型为ListItem。一般设定为下拉列表值集合的第一个值。 /// /// /// private void kdgv_ReceiptDtlData_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { int rowIndex = e.RowIndex; int columnIndex = e.ColumnIndex; if (kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex] is DataGridViewComboBoxCell) { if (kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex].Value == null) { DataGridViewComboBoxCell dataGridViewComboBoxCell = (DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex]; ListItem tstlst = (ListItem)dataGridViewComboBoxCell.Items[0]; kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex].Value = tstlst; } } } /// /// 针对ComboBox下拉列表的DataGridView数据列单元格。 /// 由于DataGridView的ComboBox列的Item至使用的是KeyValue形式的ListItem, /// 所以单元格结束编辑的时候。需要给单元格设定一个类型为ListItem的值。 /// /// /// private void kdgv_ReceiptDtlData_CellEndEdit(object sender, DataGridViewCellEventArgs e) { int rowIndex = e.RowIndex; int columnIndex = e.ColumnIndex; if (kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex] is DataGridViewComboBoxCell) { ListItem tstlst = GetComboBoxItem((DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex]); kdgv_ReceiptDtlData.Rows[rowIndex].Cells[columnIndex].Value = tstlst; } } /// /// 悬浮datagridview数据窗体,行选择后事件 /// /// /// void SalePageAddOrEditForm_AfterSelector(object sender, AfterSelectorEventArgs e) { try { DataGridViewRow row = e.Value as DataGridViewRow; DataRowView dataRow = row.DataBoundItem as DataRowView; WmsInArrivalDtlResult mdArrDtl = new WmsInArrivalDtlResult(); if (lstArrivalDtl.Count > 0 && ktb_ArrivalNo.Text != "") { int arrivalDtlId = Convert.ToInt32(dataRow["到货通知单明细ID"].ToString().Trim()); mdArrDtl = lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == arrivalDtlId); //bool isExisArrDtlId = false; //foreach (DataGridViewRow item in kdgv_ReceiptDtlData.Rows) //{ // if (Convert.ToString(item.Cells[13].Value) == dataRow["到货通知单明细ID"].ToString().Trim()) // { // isExisArrDtlId = true; // break; // } //} //if (isExisArrDtlId) //{ // KryptonMessageBox.Show($"表格中已存在相同物料:【{dataRow["物料编码"].ToString().Trim()}】相同批次:【{mdArrDtl.BATCH_NO}】的到货通知单明细行,请删除原数据行后重新添加,或者修改原数据行的信息。"); // return; //} } kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[1].Value = dataRow["物料编码"].ToString().Trim(); kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[2].Value = dataRow["物料名称"].ToString().Trim(); kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[3].Value = dataRow["物料条码"].ToString().Trim(); if (lstArrivalDtl.Count > 0) { if (mdArrDtl != null) { kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[4].Value = mdArrDtl.BATCH_NO; kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[5].Value = mdArrDtl.ARRIVAL_QTY - mdArrDtl.RECEIPT_QTY; ListItem unitLstItm = GetComboBoxItem((DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[7], mdArrDtl.UNIT_CODE); kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[7].Value = unitLstItm; ListItem supplierLstItm = GetComboBoxItem((DataGridViewComboBoxCell)kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[8], mdArrDtl.SUPPLIER_CODE); kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[8].Value = supplierLstItm; kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[9].Value = mdArrDtl.PACKAGE_CODE; kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[10].Value = mdArrDtl.PRODUCT_DATE; kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[11].Value = mdArrDtl.EXP_DATE; kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[14].Value = mdArrDtl.ARRIVAL_QTY; } } kdgv_ReceiptDtlData.Rows[e.RowIndex].Cells[13].Value = dataRow["到货通知单明细ID"].ToString().Trim(); kdgv_ReceiptDtlData.CurrentCell = this.kdgv_ReceiptDtlData[e.ColumnIndex, e.RowIndex + 1]; } catch (Exception ex) { KryptonMessageBox.Show(ex.Message); } } private void kdgv_ReceiptDtlData_DataError(object sender, DataGridViewDataErrorEventArgs e) { } private void kdgv_ReceiptDtlData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { int index = kdgv_ReceiptDtlData.Rows.Count; kdgv_ReceiptDtlData.Rows[index - 1].Cells[0].Value = index; } #endregion #region 鼠标右键单击事件 /// /// 删除选中行事件 /// /// /// private void 删除选中行ToolStripMenuItem_Click(object sender, EventArgs e) { if (!kdgv_ReceiptDtlData.CurrentRow.IsNewRow) { if (ktb_ArrivalNo.Text != "") { DataGridViewRow item = kdgv_ReceiptDtlData.CurrentCell.OwningRow; decimal currCellRecQty = item.Cells[6].Value == null ? 0 : Convert.ToDecimal(item.Cells[6].Value); int currCellArrDtlId = item.Cells[13].Value == null ? 0 : Convert.ToInt32(item.Cells[13].Value); if (currCellRecQty > 0) { WmsInArrivalDtlResult arrDtlMd = lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == currCellArrDtlId); lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == currCellArrDtlId).RECEIPT_QTY = arrDtlMd.RECEIPT_QTY - currCellRecQty; dt.Rows.Clear(); foreach (WmsInArrivalDtlResult item1 in lstArrivalDtl) { if (item1.RECEIPT_QTY < item1.ARRIVAL_QTY) { DataRow dr = dt.NewRow(); dr["物料编码"] = item1.MATERIEL_CODE; dr["物料名称"] = item1.MATERIEL_NAME; dr["物料条码"] = item1.MATERIEL_BARCODE; dr["物料类型编码"] = item1.MATERIEL_TYPE_CODE; dr["物料类型名称"] = item1.MATERIEL_TYPE_NAME; dr["到货通知单明细ID"] = item1.ARRIVAL_DTL_ID; dt.Rows.Add(dr); } } } } kdgv_ReceiptDtlData.Rows.Remove(kdgv_ReceiptDtlData.CurrentCell.OwningRow); foreach (DataGridViewRow item in kdgv_ReceiptDtlData.Rows) { int index = item.Index; kdgv_ReceiptDtlData.Rows[index].Cells[0].Value = index + 1; } } } /// /// 删除全部行事件 /// /// /// private void 全部删除ToolStripMenuItem_Click(object sender, EventArgs e) { if (ktb_ArrivalNo.Text != "") { foreach (DataGridViewRow item in kdgv_ReceiptDtlData.Rows) { decimal currCellRecQty = item.Cells[6].Value == null ? 0 : Convert.ToDecimal(item.Cells[6].Value); int currCellArrDtlId = item.Cells[13].Value == null ? 0 : Convert.ToInt32(item.Cells[13].Value); if (currCellRecQty > 0) { WmsInArrivalDtlResult arrDtlMd = lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == currCellArrDtlId); lstArrivalDtl.Find(x => x.ARRIVAL_DTL_ID == currCellArrDtlId).RECEIPT_QTY = arrDtlMd.RECEIPT_QTY - currCellRecQty; } } } kdgv_ReceiptDtlData.Rows.Clear(); } /// /// 重新加载正在编辑的收货单明细数据 /// /// /// private void 重新加载ToolStripMenuItem_Click(object sender, EventArgs e) { var loadfrm = new frmLoading(); loadfrm.Show(); var message = loadfrm.EventCalExec(LoadWmsInReceiptDtlData); if (!string.IsNullOrWhiteSpace(message)) { KryptonMessageBox.Show($"查询失败!\r\n{message}", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } #endregion private void button1_Click(object sender, EventArgs e) { button1.Enabled = false; try { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("MaterialCode"); dt.Columns.Add(dc); dc = new DataColumn("UnitCode"); dt.Columns.Add(dc); dc = new DataColumn("MaterialName"); dt.Columns.Add(dc); dc = new DataColumn("Specs"); dt.Columns.Add(dc); dc = new DataColumn("BatchNo"); dt.Columns.Add(dc); dc = new DataColumn("Qty"); dt.Columns.Add(dc); dc = new DataColumn("UniqueLabel"); dt.Columns.Add(dc); foreach (WmsInReceiptDtlResult item in ReceiptDataNotEdit.WmsInReceiptDtlList) { DataRow dr = dt.NewRow(); dr["MaterialCode"] = item.MATERIEL_CODE; dr["UnitCode"] = item.UNIT_CODE; dr["MaterialName"] = item.MATERIEL_NAME; dr["Specs"] = item.MATERIEL_SPEC; dr["BatchNo"] = item.BATCH_NO; dr["Qty"] = item.RECEIPT_DTL_QTY; dr["UniqueLabel"] = item.MATERIEL_CODE + "_" + item.RECEIPT_DTL_ID; dt.Rows.Add(dr); } DataSet dts = new DataSet(); dts.Tables.Add(dt); FastReport.Report report = new FastReport.Report(); string filename = _reportFolder + "标签数据.frx"; report.Load(filename); report.RegisterData(dts); report.Prepare(); report.PrintSettings.ShowDialog = false; report.Print(); report.Clear(); } catch (Exception ex) { KryptonMessageBox.Show(ex.Message); } button1.Enabled = true; } } }