You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:03