金蝶云星空——过滤界面文本框弹出选单界面

佚名 / 2025-01-21 / 原文

0. 构造显示编辑按钮的文本框

1.在过滤界面拖一个文本控件,设置其“显示编辑按钮”:true。若是需要禁止输入,只能通过编辑按钮进行修改,则设置“编辑风格”:仅按钮编辑
2.创建服务插件,注意过滤界面是继承:动态表单-->公共过滤 的,所以服务插件中的需要继承的是:AbstractDynamicFormPlugIn
3.文本框的编辑按钮的事件在:BeforeF7Select 中可以获取到

1. 最简代码示例

using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace WeiWaiFaLiaoQingDanFilter4
{
    /// <summary>
    /// 委外发料清单过滤窗口——表单插件
    /// </summary>
    [Description("委外发料清单过滤窗口——表单插件—采购订单弹出可选窗口")]
    //参考:https://vip.kingdee.com/article/393320998612955648?productLineId=1&lang=zh-CN
    public class TextEditButtonPlugIn : AbstractDynamicFormPlugIn
    {
        //参考:https://vip.kingdee.com/article/66518760642775808?productLineId=1&lang=zh-CN
        public override void BeforeF7Select(BeforeF7SelectEventArgs e)
        {
            base.BeforeF7Select(e);
            //FPOBILLNOS是文本框的标识
            if (e.FieldKey.EqualsIgnoreCase("FPOBILLNOS"))
            {
                this.ShowPurchaseOrder();
            }
        }

        //参考:https://vip.kingdee.com/article/158494475516452352?share_fromuid=2147411495&productLineId=1&lang=zh-CN
        //参考:https://vip.kingdee.com/article/67241621690988800?productLineId=1&lang=zh-CN
        private void ShowPurchaseOrder()
        {

            //打开单据列表
            ListShowParameter listShowPara = new ListShowParameter();
            listShowPara.FormId = "PUR_PurchaseOrder";
            listShowPara.PageId = Guid.NewGuid().ToString();
            listShowPara.ParentPageId = this.View.PageId;
            listShowPara.MultiSelect = true;//允许多选
            listShowPara.ListType = (int)Kingdee.BOS.Core.Enums.BOSEnums.Enu_ListType.BaseList;
            //listShowPara.ListType = (int)Kingdee.BOS.Core.Enums.BOSEnums.Enu_ListType.SelBill;
            listShowPara.IsLookUp = true;
            //过滤条件已审核
            listShowPara.ListFilterParameter.Filter = listShowPara.ListFilterParameter.Filter.JoinFilterString(" FDocumentStatus ='C' ");
            listShowPara.IsShowUsed = true;
            listShowPara.IsShowApproved = false;

            //基于委托回调机制,实现往父窗体中传递数据
            this.View.ShowForm(listShowPara, delegate (FormResult result)
            {
                if (result.ReturnData != null)
                {
                    ListSelectedRowCollection returnData = result.ReturnData as ListSelectedRowCollection;
                    if (returnData.Count > 0)
                    {
                        List<string> billNumbers = returnData.Select(o => o.BillNo).ToList();
                        //赋值到字段
                        this.View.Model.SetValue("FPoBillNos", string.Join(",", billNumbers));//将用户多选的数据进行拼接
                        this.View.UpdateView("FPoBillNos");
                    }
                }
            });
        }
    }
}

2. 关于选中的单据获取分录行Id和行号

首先设置显示样式

   listShowPara.ListType = (int)Kingdee.BOS.Core.Enums.BOSEnums.Enu_ListType.List;

其次,我们将获取到的returnData打印出来如下

[
    {
        "PrimaryKeyValue": "104327",
        "EntryPrimaryKeyValue": "116534",
        "SubEntryPrimaryKeyValue": "",
        "EntryEntityKey": "FSaleOrderEntry",
        "Number": null,
        "Name": null,
        "FullParentNamePath": null,
        "BillNo": "XSDD003155",
        "RowKey": 96,
        "Selected": true,
        "DisplayMessage": "",
        "FormID": "SAL_SaleOrder",
        "LayoutID": "",
        "BillTypeID": "eacb50844fc84a10b03d7b841f3a6278",
        "MainOrgId": 1,
        "FieldValues": {
            "FBillHead": "104327",
            "FSaleOrderEntry": "116534"
        }
    }
]

比如:这里选择销售订单,获取选中的销售订单的明细行,首先可以从returnData中获取到一个FieldValues的字典类型对象
其中FBillHead就是选中的销售订单的内码,FSaleOrderEntry则是选中的销售订单行的内码,这里需要通过数据库查询一下,才能获取到销售订单明细行的序号FSEQ

this.View.ShowForm(listShowPara, delegate (FormResult result)
{
    if (result.ReturnData != null)
    {
        ListSelectedRowCollection returnData = result.ReturnData as ListSelectedRowCollection;
        if (returnData.Count > 0)
        {
            string xsddBillNo = returnData.Select(o => o.BillNo).FirstOrDefault();
            Dictionary<string, string> fieldValues = returnData.Select(o => o.FieldValues).FirstOrDefault();
            Logger.Error("生产订单", "获取选中销售订单行数据", new Exception(JsonUtil.Serialize(returnData)));
        
            this.View.Model.SetValue("FXSDD", xsddBillNo);
            this.View.UpdateView("FXSDD");

            string xsddSeqId = fieldValues["FSaleOrderEntry"].ToString();
            string sql = $"SELECT FSEQ FROM  dbo.T_SAL_ORDERENTRY WHERE FENTRYID='{xsddSeqId}'";
            DynamicObjectCollection doXsddSeq = DBUtils.ExecuteDynamicObject(Context, sql);
            if (doXsddSeq != null)
            {
                string xsddSeq = doXsddSeq[0]["FSEQ"].ToString();
                this.View.Model.SetValue("FXSDDSEQ", xsddSeq);
                this.View.UpdateView("FXSDDSEQ");
            }
        }
    }
});