
@[TOC](目录)
## 背景
想实现列表执行某操作时弹出对话框,在对话框里输入该操作的备注信息,然后该信息需要存放到单据中的操作备注信息字段中。类似委外订单列表强制结案操作时填写强制结案原因

## 操作步骤
### 1、新增对话框动态表单
- 到BOS上新增动态表单,复制【强制结案】业务对象即可,自己自行取一个名字和标识,标识不能太随意,因为后面代码需要引用该业务对象标识,我这里取名为【列表终止】,标识为【ABC_ListTerminateOperation】

- 检查下复制出来的【列表终止】属于哪个子系统,不在意存放位置的兄弟可以不用管

- 如果子系统不对可以选择业务对象后右键修改子系统

- 修改【列表终止】中【标签】的标识和名称

- 动态表单里的【多语言文本】的标识不要修改,沿用原本的“FCloseReason”,这里主要是该动态表单的表单插件里需要处理该字段的值用以返回。标识改了就不会返回这个字段了,除非你连表单插件一起改

- 到这里弹出的对话框这一动态表单就准备好了,原先有的表单插件需要留着,借用一下表单插件,可以减少工作量,有兴趣的兄弟自己反编译看这个动态表单的表单插件
### 2、单据上新增操作备注信息字段
- 在单据上新增一个【多语言文本】字段,用来接收对话框里的信息,我这里标识为【FTerminateText】,属性名为【TerminateText】

- 在列表菜单集合中新增一个按钮,为这个按钮绑定一个点击事件,新增一个操作,以终止操作为例

- 到这里BOS上的配置步骤就完成了,现在需要编写一个列表插件来处理点击操作后弹出对话框,并且在对话框里填写信息点击确定后将对话框里的备注信息保存到单据上
### 3、新增当前单据列表插件(C#示例)
- 可能需要引用的包

- 具体实现,直接上代码:
```C#
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.SCM.Business;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1 : AbstractListPlugIn
{
///
/// 列表终止原因
///
private LocaleValue listTerminateReason = null;
///
/// 是否执行操作标识
///
private bool _isInvoked = false;
///
/// 列表终止成功的订单数据
///
private string[] listTerminateIds = null;
///
/// 列表终止成功后的订单数据
///
private Dictionary<long, string> dicTerminateEntryIds = new Dictionary<long, string>();
public override void BeforeDoOperation(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeforeDoOperationEventArgs e)
{
base.BeforeDoOperation(e);
switch (e.Operation.FormOperation.Operation.ToUpperInvariant())
{
case "TERMINATE":
if (this.ListView.SelectedRowsInfo.Count == 0)
{
this.View.ShowErrMessage("请至少选择一行分录!");
return;
}
if (_isInvoked)
{
_isInvoked = false;
break;
}
e.Cancel = true;//所有终止操作都先终止,等待对话框处理结果再调用
string[] moSelIds = this.ListView.SelectedRowsInfo.GetPrimaryKeyValues();
Dictionary<long, string> moEntryIds = this.ListView.SelectedRowsInfo.GetEntryPrimaryKeyValues().ToDictionary(x => Convert.ToInt64(x));
DynamicFormShowParameter parameter = new DynamicFormShowParameter();
parameter.FormId = "ABC_ListTerminateOperation";
parameter.PageId = Guid.NewGuid().ToString();
parameter.OpenStyle.ShowType = ShowType.Modal;
parameter.CustomParams["ExeCuteTimeType"] = "0";
this.View.ShowForm(parameter, x =>
{
object returnResult = x.ReturnData;//对话框(动态表单)的回调返回值
if (x.ReturnData.IsNullOrEmpty())
{
//无数据说明对话框选择的是取消
e.Cancel = true;
return;
}