实现功能:做一个自定义参照,绑定到项目(色号)里,替换掉系统原来的参照。在料号(底布花型)参照里选出一个料号,这个料号作为参数传到自定义项目参照里,过滤出相关的项目来,(不相关的不在参照里显示)。顺便带出一个实体扩展字段10(工厂色)。
一、自定义一个参照。
做好一个料号项目号关联实体(UFIDA.U9.MO.JR.hduzh.JRItemProjBE.MetaData.dll,杜忠搞定),发布后在,在发布对象浏览器里找到并把proj_ID, proj_code, proj_name, proj_shortname, DescFlexField_PubDescSeg10字段拖出来
在数据库里查询到工厂色存到实体扩展字段十里,所以也要拖进去。
添加一个参数ItemID。过滤表达式设置为:UFIDA::U9::MO::JR::hduzh::JRItemProjBE::JRItemProj.Item.ID=@ItemID。发布,拷贝.dll,执行sql
二、建立UI扩展。
SOProjRef.cs
1,在数据库里查到标准销售里的WebPart名称,添加引用。定义一个变量。
StandardSOMainUIFormWebPart soWebPart;
2,找到项目号控件ID,把控件强转成参照类型,并把自定义台照绑定到该控件里。(找控件ID时,通过查看源文件找,在没有个性化的数据库里找,这里,个性化之后的ID是project,但是一直找不到,没个性化时是project2。搞定)
public override void AfterInit(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
{
base.AfterInit(Part, args);
soWebPart = (StandardSOMainUIFormWebPart)Part;
System.Web.UI.Control c = soWebPart.FindControl("Project2");
IUFFldReference refprj = (IUFFldReference)c;
UIControlBuilder.SetReferenceControlRefInfo(refprj, "2e07d219-5840-4e0b-9567-6cb2f7822392", 580, 408, "Proj_Name", "Proj_Code", "Proj_ID", soWebPart.Model.SO_SOLines.FieldProject_Code, soWebPart.Model.SO_SOLines.FieldProject_Name);
}
3,注册回调函数,
当料号(ID为ItemInfo_ItemID)的值改变时,料号的值作为参数过滤条件,过滤出相关色号的值。
public override void AfterLoad(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
{
base.AfterLoad(Part, args);
soWebPart = (StandardSOMainUIFormWebPart)Part;
this.GridItemRef_DoBeforeCallback(soWebPart);
this.GridItemRef_DoBeforeCallback2(soWebPart);
}
//当ItemInfo_ItemID的值改变时,把值作为过滤参数,通过过滤条件过滤出相关的色号
private void GridItemRef_DoBeforeCallback(StandardSOMainUIFormWebPart soWebPart)
{
IUFDataGrid datagrid = (IUFDataGrid)soWebPart.GetUFControlByName(soWebPart.TopLevelContainer, dataGridName);
//定义一个关联控件
AssociationControl assoCGrid = new AssociationControl();
assoCGrid.SourceServerControl = datagrid;
assoCGrid.SourceControl.EventName = "OnCellDataChanged";
((UFWebClientGridAdapter)assoCGrid.SourceControl).FireEventCols.Add("ItemInfo_ItemID");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
callBackFrm.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(assoCGrid_DoBeforeItemAction);
callBackFrm.ParameterControls.Add(datagrid);
callBackFrm.Add(assoCGrid);
soWebPart.Controls.Add(callBackFrm);
}
private Object assoCGrid_DoBeforeItemAction(CustomerActionEventArgs args)
{
IUFDataGrid datagrid = (IUFDataGrid)soWebPart.GetUFControlByName(soWebPart.TopLevelContainer, dataGridName);
string rowIndex = ((ArrayList)args.ArgsHash[UFWebClientGridAdapter.ALL_GRIDDATA_SelectedRows])[0].ToString(); //返回被选种的行号
ArrayList resGrid = (ArrayList)args.ArgsHash[datagrid.ClientID];
int rowCount = ((ArrayList)args.ArgsHash[datagrid.ClientID]).Count; //返回当Grid行数
soWebPart.CurrentState["JR_rowCount"] = rowCount;
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(datagrid);
string itemCode = string.Empty;
string itemID = "";
//获得客户料号
itemID = ((Hashtable)((ArrayList)args.ArgsHash[datagrid.ClientID])[int.Parse(rowIndex)])["ItemInfo_ItemID"].ToString();
if (string.IsNullOrEmpty(itemID))
{
return args;
}
//把itemID存为缓存,在参照项目里设置过滤条件,如果缓存不为空,则过滤条件为"Item.ID=@itemID",参数@itemID值为缓存的值
soWebPart.CurrentState["JRProjectRef_ItemID"] = itemID;
return args;
}
4, 确定项目(色号)之后,工厂色也可以确定唯一,自动带出来。
private void GridItemRef_DoBeforeCallback2(StandardSOMainUIFormWebPart soWebPart)
{
IUFDataGrid datagrid = (IUFDataGrid)soWebPart.GetUFControlByName(soWebPart.TopLevelContainer, dataGridName);
AssociationControl assoCGrid = new AssociationControl();
assoCGrid.SourceServerControl = datagrid;
assoCGrid.SourceControl.EventName = "OnCellDataChanged";
((UFWebClientGridAdapter)assoCGrid.SourceControl).FireEventCols.Add("Project");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
callBackFrm.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(assoCGrid_Project_CellDataChangedAction);
callBackFrm.ParameterControls.Add(datagrid);
callBackFrm.Add(assoCGrid);
soWebPart.Controls.Add(callBackFrm);
}
private Object assoCGrid_Project_CellDataChangedAction(CustomerActionEventArgs args)
{
IUFDataGrid datagrid = (IUFDataGrid)soWebPart.GetUFControlByName(soWebPart.TopLevelContainer, dataGridName);
string rowIndex = ((ArrayList)args.ArgsHash[UFWebClientGridAdapter.ALL_GRIDDATA_SelectedRows])[0].ToString();
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(datagrid);
string itemCode = string.Empty;
if (soWebPart.CurrentState["cRef_DescFlexField_PubDescSeg10"] != null)
{
string pubDescSeg10 = soWebPart.CurrentState["cRef_DescFlexField_PubDescSeg10"].ToString();
grid.CellValue.Add(new Object[] { rowIndex, "DescFlexField_PubDescSeg10", new string[] { pubDescSeg10, pubDescSeg10, pubDescSeg10 } });
args.ArgsResult.Add(grid.ClientInstanceWithValue);
}
return args;
}
三,在参照的项目里(文件为JRProjectRefRefWebPartCodeBehindExtend.cs),把UI缓存的值赋给参数ItemID,实现过滤条件。当参数为空,则不用过滤,显示所有的色号
1, #region 自定义数据初始化加载和数据收集
private void OnLoadData_Extend(object sender)
{
//标准销售料品ID不为空,过滤,把缓存的底布花型(料号)赋给自定义参照的参数。为空,把过滤条件去掉
if (this.CurrentState["JRProjectRef_ItemID"] != null)
{
this.Model.cRef.CurrentFilter.OPath = "Item.ID = @ItemID";
this.Model.cRef.CurrentFilter.Parameters["@ItemID"].DataValue = this.CurrentState["JRProjectRef_ItemID"];
}
//料品ID不为空,过滤,为空,把过滤条件去掉
else
{
this.Model.cRef.CurrentFilter.OPath = "";
}
OnLoadData_DefaultImpl(sender);
}
2, #region 自己扩展 Extended Event handler
public void AfterOnLoad()
{
//工厂色有值时才传进去,否则会出现未将对像实例化错误
if (this.Model.cRef.RecordCount > 0)
{
if (!string.IsNullOrEmpty(this.Model.cRef.FocusedRecord.DescFlexField_PubDescSeg10))
{
this.CurrentState["cRef_DescFlexField_PubDescSeg10"] = this.Model.cRef.FocusedRecord.DescFlexField_PubDescSeg10;
}
}
}
四,修改WebPart配置文件(D:/UFIDA/U9V201/Portal/ WebPartExtend.config),添加以下节点
<ExtendedPart parentPartFullName="UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart"
extendedPartFullName="UFIDA.U9.SCM.SD.ItemProj.SOProjRef"
extendedPartAssemblyName="UFIDA.U9.SCM.SD.ItemProj">
</ExtendedPart>
第一个参数为WebPart全名,第二个为UI项目dll名+类名,第三个参数为UI项目dll名