小技巧 - 如何在界面中嵌入销售订单列表与详情
金蝶云社区-JohnnyDing
JohnnyDing
7人赞赏了该文章 6,516次浏览 未经作者许可,禁止转载编辑于2015年08月03日 18:01:01

背景:
需要在一个界面上,同时显示销售订单的单据列表与单据维护界面。用户双击列表中的某一行时,自动把此行订单详情,显示在维护界面上。

难点:
1. 如何显示单据、列表界面,并嵌入到一个面板中?
2. 在子页面上,如何把消息传递给父页面,通知父页面刷新其他子页面数据?

案例介绍:
1. 新增加一个动态表单,使用分割容器分为上下两个部分;
2. 分割容器上部分,添加一个面板F_JD_PanelList,用于显示销售订单列表;下部分,添加一个面板F_JD_PanelEdit,用于显示销售订单维护界面;
3. 动态表单的表单维护插件,挂上 S150731MergeListAndEdit,销售订单列表插件,挂上 S150731SaleOrderList

效果:

示例代码,本地验证OK:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
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.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.Bill;

namespace JDSample.FormPlugIn.DynamicForm
{
///


/// 演示把销售订单列表与维护界面合并在一个界面上
///

///
/// 案例说明:
/// 定义一个动态表单,首先添加分割容器,把界面分为左右两部分
/// 添加两个面板(F_JD_PanelList, F_JD_PanelEdit),分别充满分割容器的左右两边
/// 面板F_JD_PanelList显示列表;F_JD_PanelEdit显示维护界面
/// 销售订单列表双击时,自动刷新维护界面
///

[Description("演示把销售订单列表与维护界面合并在一个界面上")]
public class S150731MergeListAndEdit : AbstractDynamicFormPlugIn
{
///
/// 列表子界面PageId
///

private string _listPageId = null;
///
/// 维护子界面PageId
///

private string _editPageId = null;

///
/// 界面数据绑定事件
///

///
///
/// 在此事件中,把列表界面,显示在左面板上
///

public override void AfterBindData(EventArgs e)
{
ListShowParameter showParam = new ListShowParameter();
showParam.FormId = "SAL_SaleOrder";
showParam.PageId = Guid.NewGuid().ToString();
showParam.OpenStyle.ShowType = ShowType.InContainer;
showParam.OpenStyle.TagetKey = "F_JD_PanelList";

showParam.CustomParams.Add("ignoreDoubleClick", "true");
this.View.ShowForm(showParam);

this._listPageId = showParam.PageId;
}

///
/// 不确定事件:在此事件中,接收子列表界面通知的列表双击事件
///

///
public override void CustomEvents(CustomEventsArgs e)
{
if (e.Key.EqualsIgnoreCase("List")
&& e.EventName.EqualsIgnoreCase("EntityRowDoubleClick"))
{
if (string.IsNullOrWhiteSpace(this._editPageId))
{// 用户首次双击列表行,第一次加载单据维护界面

BillShowParameter showParam = new BillShowParameter();
showParam.FormId = "SAL_SaleOrder";
showParam.PageId = Guid.NewGuid().ToString();
showParam.OpenStyle.ShowType = ShowType.InContainer;
showParam.OpenStyle.TagetKey = "F_JD_PanelEdit";

showParam.Status = Kingdee.BOS.Core.Metadata.OperationStatus.EDIT;
showParam.PKey = e.EventArgs;

this.View.ShowForm(showParam);
this._editPageId = showParam.PageId;
}
else
{// 已经加载了单据维护界面,刷新数据即可
IBillView billView = this.View.GetView(this._editPageId) as IBillView;
billView.OpenParameter.PkValue = e.EventArgs;
((IDynamicFormViewService)billView).LoadData();
this.View.SendDynamicFormAction(billView);
}
}
}
}

///
/// 销售订单列表插件
///

///
/// 在销售订单列表上双击时,通知父页面进行处理,不直接弹出单独的销售订单维护界面
///

public class S150731SaleOrderList : AbstractListPlugIn
{
///
/// 是否忽略列表本身的双击处理
///

private bool _ignoreDoubleClick = false;

///
/// 初始化事件,在此事件中
///

///
public override void OnInitialize(InitializeEventArgs e)
{
base.OnInitialize(e);
var value = e.Paramter.GetCustomParameter("ignoreDoubleClick");
if (value != null)
{
this._ignoreDoubleClick = Convert.ToBoolean(value);
}
}

///
/// 用户双击了列表中某行,此时需要通知父页面刷新右边维护界面
///

///
public override void ListRowDoubleClick(ListRowDoubleClickArgs e)
{
if (this.View.ParentFormView == null
|| this.ListView.CurrentSelectedRowInfo == null)
{
return;
}
else if (this._ignoreDoubleClick == true)
{
// 通知父窗口,响应列表双击事件
((IDynamicFormViewService)this.View.ParentFormView).CustomEvents(
"List",
"EntityRowDoubleClick",
this.ListView.CurrentSelectedRowInfo.PrimaryKeyValue);

this.View.SendDynamicFormAction(this.View.ParentFormView);

// 系统预置,双击弹出维护界面的处理,则取消掉
e.Cancel = true;
}
}
}
}