C#(Epicor E11 ERP)如何实现消息弹窗确认后清空无效COO字段值
问题根因
Epicor ERP E11的输入控件默认和底层EpiDataView数据源双向绑定,你直接修改cmbCountryOrg.Text仅修改了UI层的临时显示值,当弹窗点击确认后,控件失去焦点触发绑定同步逻辑,会自动从数据源重新拉取原来的无效值,就出现了回退现象。
解决方案
方案1:优先推荐,在字段变更前置事件拦截(最稳定)
如果你的逻辑写在BeforeFieldChanged事件中,直接取消无效值的写入即可,不需要后续手动清空:
case "CountryofOrigin_c": if (args.ProposedValue != null) { string inputCountry = args.ProposedValue.ToString().Trim(); DataTable dt1 = GetBAQ("NML_COOList"); // 对用户输入做单引号转义,避免过滤逻辑报错 string filter = $"Country_Description = '{inputCountry.Replace("'", "''")}'"; DataTable dtFilter1 = Filter(dt1, filter); if (dtFilter1.Rows.Count == 0) { // 直接拦截无效值写入数据源 args.Cancel = true; MessageBox.Show("您输入的国家无效"); } } break;
方案2:如果逻辑写在后置事件中,同步修改底层数据源
不要只修改控件Text,同步更新绑定的EpiDataView字段值:
case "CountryofOrigin_c": DataTable dt1 = GetBAQ("NML_COOList"); string userInput = Convert.ToString(cmbCountryOrg.Text).Replace("'", "''"); string RowFilter1 = $"Country_Description = '{userInput}'"; DataTable dtFilter1 = Filter(dt1,RowFilter1); if (dtFilter1.Rows.Count==0) { // 获取控件绑定的数据源视图,括号内替换为你实际绑定的视图ID,例如OrderHed、OrderDtl等 EpiDataView edv = (EpiDataView)oTrans.EpiDataViews["你的业务视图ID"]; cmbCountryOrg.BeginUpdate(); // 修改底层数据源的字段值 edv.CurrentRow["CountryofOrigin_c"] = DBNull.Value; // 同步更新UI显示 cmbCountryOrg.Text = string.Empty; cmbCountryOrg.EndUpdate(); // 标记事件已处理,避免Epicor默认逻辑覆盖修改 args.Handled = true; MessageBox.Show("您输入的国家无效"); } break;
额外优化建议
你原代码中直接拼接用户输入构造过滤条件,存在输入单引号导致逻辑报错的风险,建议统一做单引号转义处理,如上面代码示例中的Replace("'", "''")操作。
内容的提问来源于stack exchange,提问作者Brute
相关产品推荐
相关产品推荐

