【060】客开UI插件示例(转)
侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计收到 2 条评论

【060】客开UI插件示例(转)

竹秋廿九
2025-08-15 / 0 评论 / 20 阅读 / 正在检测是否收录...
原文地址:客开UI插件案例

客开UI插件

注意事项

开发UI插件时确保不要开启热插件,即..\Portal\bin\environment.xml中属性uipluging必须设置为false(设置为true页面开发的dll拷贝不需要重启IIS)

如何客开UI插件:

PluginTool工具做UI插件时很多页面找不到webpart,特别是弹窗找不到webpart,做插件最后的方式是用如下方法做插件,不用这个工具,因为这个工具能做的东西非常有限
先找webpart:
先打开U9要做UI插件的页面,找到页面的uri或者formid,如下图所示:

可以从如下界面找到URI(单点登录是也要获取这个URI)

如果是弹窗页面,需要找FormID,如下图:

找到URI或者FormID后,就可以在classview(数据字典)中找到webpart,如下图:

写配置文件

UI插件的.config配置文件必须以WebPartExtend_命名(建议从如下解决方案中用解决方案中的那个配置文件),节点一般是:
            extendedPartAssemblyName="UFIDA.U9.Cust.U9Demo.PlugUI.dll" />
其中parentPartFullName是上一步我们找出的webpart,名字必须要完全对,extendedPartFullName是自己VS客开的这个类库的命名空间+自己的这个类名,如图:

extendedPartAssemblyName为自己VS客开的这个解决方案的程序集名称,如图:

参考客开解决方案(建议用这个解决方案改类库的程序集名称、命名空间、配置文件,改成自己项目的,建议改成UFIDA.U9.Cust.项目简称.模块简称PlugIn:

链接:https://pan.baidu.com/s/1IpRiHFTlHPePJAQ9rNl7aQ?pwd=1234
提取码:1234

一、按钮操作

1、业务场景(增加按钮)

UI插件开发最常用的场景之一,对标准产品页面需要增加按钮来实现不同业务需要,先对U9标准页面增加按钮的三种方法分别举例说明
(UI插件增加的按钮无法设置权限:一般情况下可以变通方案处理,处理思路:参数设置里面加个参数,录入用户编码或者角色编码(逗号隔开),代码里面取这个值判断UI插件增加的按钮可用或不可用)

案例1:Toolbar上增加按钮(页面最顶层区域)

// (1)、实例化按钮
IUFButton btnPRToPM = new UFWebButtonAdapter();

//(2)、加入功能栏Card中
IUFToolbar toolbar = (IUFToolDescFlexFieldbar)part.GetUFControlByName(part.TopLevelContainer, "Toolbar1");//可以使用F12在页面上找,一般情况下名字就叫Toolbar1

if (toolbar != null)
{
    string guid = "047FC9F5-46C0-449A-83C2-2822BCF24012";// 在数据库生成下GUID,或者修改下这里的值。SELECT NEWID()
    btnPRToPM = UIControlBuilder.BuilderToolbarButton(toolbar, "True", "btnPRToPM", "True", "True", 70, 28, "7", "", true, false,guid, guid, guid);
    UIControlBuilder.SetButtonAccessKey(btnPRToPM);
    btnPRToPM.Text = "拉单销售订单";
    btnPRToPM.ID = "btnPRToPM";
    btnPRToPM.AutoPostBack = true;
    btnPRToPM.UIModel = part.Model.ElementID;
    ((UFWebToolbarAdapter)toolbar).Items.Add(btnPRToPM as System.Web.UI.WebControls.WebControl);
    btnPRToPM.Click += new EventHandler(btnPRToPM_Click);//自己的点击事件
}

案例2:页面最下方按钮区域增加按钮(页面最底层区域)


IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, "Card0");//一般情况下名称为Card0,具体请使用F12查看
IUFButton btnPRToPM2 = new UFWebButtonAdapter();
btnPRToPM2.Text = "拉单销售订单";
btnPRToPM2.ID = "btnPRToPM2";
btnPRToPM2.AutoPostBack = true;
card.Controls.Add(btnPRToPM2);
btnPRToPM2.Click += new EventHandler(BtnPRToPM2_Click);
CommonFunction.Layout(card, btnPRToPM2, 16, 0);   //一般为从左往右按钮个数乘以2

CommonFunction类代码如下:

public class CommonFunction
{
    public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y)
    {
        Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(0), Unit.Pixel(0), true);
    }

    public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int width, int height)
    {
        Layout(container, ctrl, x, y, 1, 1, Unit.Pixel(width), Unit.Pixel(height), false);
    }
    
    public static void Layout(IContainer container, IUFControl ctrl, uint x, uint y, int xspan, int yspan,Unit width, Unit height, bool isAutoSize)
    {
        IGridLayout gl = container.Layout as IGridLayout;
        if (gl == null) return;
        GridLayoutInfo glInfo = new GridLayoutInfo((uint)x, (uint)y, (uint)xspan, (uint)yspan, width, height);
        glInfo.AutoSize = isAutoSize;
        gl.Controls.Add((Control)ctrl, glInfo);
    }
    
    public static IUFControl FindControl(IPart part, string parentControl, string control)
    {
        IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, parentControl);
        if (card == null)
            return null;
        foreach (IUFControl ctrl in card.Controls)
        {
            if (ctrl.ID.Equals(control, StringComparison.OrdinalIgnoreCase))
            {
                 return ctrl;
            }
        }
        return null;
    }
}

案例3:页面最下方下拉按钮中增加按钮

IUFMenu btnPRToPM1 = new UFWebMenuAdapter();
btnPRToPM1.Text = "拉单销售订单";
btnPRToPM1.ID = "BtnQurySaleOrder2";
btnPRToPM1.AutoPostBack = true;
IUFDropDownButton menuButtion = (IUFDropDownButton)CommonFunction.FindControl(part, "Card0", "DDBtnOperation");//Card0为操作按钮区域名称,可在浏览器开发工具或F12看到,DDBtnOperation为下拉按钮的名称,使用F12一样可以看到
if (menuButtion != null)
{
    //btnPRToPM1.ItemClick += BtnPRToPM1_ItemClick;//注意这里注册的是//ItemClick事件
    menuButtion.MenuItems.Add(btnPRToPM1);
}

2、业务场景:点击页面上按钮后写判断逻辑

点击按钮后执行产品按钮事件前和执行产品按钮事件后都可以做插件,可分别使用BeforeEventProcess和AfterEventProcess事件,可重写这两个事件。
业务场景:用户点击提交后弹窗给用户提示是否提交或取消。
方案:
U9内部没有方法可实现弹窗点击确定后执行一个操作,点击取消后执行另一个操作,
需要UBF开发一个自定义视图页面做弹窗(两个按钮,一个字段作为提示即可),以下是代码示例

public override void BeforeEventProcess(UFSoft.UBF.UI.IView.IPart Part, string eventName, object sender, EventArgs args, out bool executeDefault)
{
    UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter webButton = sender as UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter;
    //按钮不同区域这个类型可能不一样,调试状态下可以看出sender参数的对象类型 

    //审核按钮 
    if (webButton != null && (webButton.Action == "SubmitClick" || webButton.Action == "AppvoveClick"))
    {
        if ("需要弹窗")
        {
            part.ShowAtlasModalDialog(btnPRToPM2, "e37cea28-9138-43a4-bbe7-e747977e3db5", "已转成功请购单", "992", "504", "", null, true, false, false);
            //btnPRToPM2按钮是自己增加的自定义按钮,用于回调(弹窗关闭后执行的代码实现)
            //BtnCreatPR1为自定义按钮,默认隐藏,弹窗回调使用
            //弹窗后需要将指令(点击了确定还是取消)写入到part.CurrentState["XXX"]中
            executeDefault = false; //这里不执行审核后事件动作了
            return;
        }
    }
    base.BeforeEventProcess(Part, eventName, sender, args, out executeDefault);
}

void BtnPRToPM2_Click(object sender, EventArgs e)
{
    this.part.Model.ClearErrorMessage();

    if ("点击了确定继续执行") //part.CurrentState["XXX"]中获取标识
        _part.BtnApprove_Click(sender, e);
    else
        return;
}

private UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart part;
IUFDataGrid DataGrid4;
IUFButton btnPRToPM2;

public override void AfterInit(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
{
    //首先调用原来的事件
    base.AfterInit(Part, args);
    part = Part as UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart;
    if (part == null)
        return;

    DataGrid4 = (IUFDataGrid)part.GetUFControlByName(part.TopLevelContainer, "DataGrid4");

    //2.Card里面增加按钮
    //设置按钮在容器中的位置
    #region 2.Card里面增加按钮
    IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, "Card0");
    btnPRToPM2 = new UFWebButtonAdapter();
    btnPRToPM2.Text = "拉单销售订单";
    btnPRToPM2.ID = "BtnQurySaleOrder1";
    btnPRToPM2.AutoPostBack = true;
    card.Controls.Add(btnPRToPM2);
    btnPRToPM2.Click += new EventHandler(BtnPRToPM2_Click);
    CommonFunction.Layout(card, btnPRToPM2, 16, 0); //一般为从左往右按钮个数乘以2
    #endregion
}

业务场景:标准查询列表客开如何干预查询结果


public override void BeforeDataBinding(IPart Part, out bool executeDefault)  
{  
     base.BeforeDataBinding(Part, out executeDefault);  
     if (_strongPart == null || this._strongPart.Model.PlanOrder == null)  
         return;  
     _strongPart.Model.PlanOrder.CurrentFilter.OPath += " and DocNo >='051025070200613'";  
     _strongPart.Action.NavigateAction.Refresh(null, true);  
}

二、界面行数据(DataGridView)操作

针对行的数据操作,经常有业务场景,需要根据行的数量、单价计算金额等其他复杂的计算,这种情况无论插件还是单据都需要借助Callback或PostBack进行计算。
Callback和Postback的区别:
Callback:页面赋值后只局部刷新,页面只刷新需要修改的值,修改的值实时反映到页面控件上,不联动修改其他字段,不引起其他任何字段的联动。
PostBack:页面赋值后页面全局刷新,需要进行数据收集和绑定才会反映到控件上,会引起其他控件的联动。
两种方式都可以实现页面简单计算、对行字段赋值。如果需要对字段联动或者新增行之类的操作比较多的字段可以选用PostBack实现。(具体可在实际使用过程中视情况来定,两种方法切换也较为方便)
具体案例类型有:数量、单价计算金额等类似;

DataGridView可注册事件:
可从..\Portal\js\DataGrid.js文件中查询到

DataGridEvent.OnRowClick = "OnRowClick";
DataGridEvent. " "OnSortData";
DataGridEvent. " DataGridEvent. "OnBeforeOpenDialog";
DataGridEvent.OnAfterOpenDialog = "OnAfterOpenDialog";
DataGridEvent.OnBeforeCustomerPostBack = "OnBeforeCustomerPostBack";
DataGridEvent.OnAfterRowAdded = "OnAfterRowAdded";
DataGridEvent.OnCellDataChanged = "OnCellDataChanged";
DataGridEvent.OnCellDataValueChanged = "OnCellDataValueChanged";
DataGridEvent.OnBeforeRowAdd = "OnBeforeRowAdd";
DataGridEvent. " "OnControlValueChange";
DataGridEvent.OnCustomFilter = "OnCustomFilter"; //响应过滤菜单事件.
DataGridEvent. " "CustomerPostBack"; //服务器端自定义事件
DataGridEvent.OnBatchModify = "OnBatchModify"; //批量修改事件//region  自定义用户事件

function DataGridEvent() { }
DataGridEvent.OnBodyRowSelectedChange = "OnBodyRowSelectedChange";
DataGridEvent.OnBodyRowSelectedValueChange = "OnBodyRowSelectedValueChange";
DataGridEvent.OnBodyRowSelected = "OnBodyRowSelected";DataGrid行checkbox的触发事件
DataGridEvent.OnBeforeRowInsert = "OnBeforeRowInsert";
DataGridEvent.OnBeforeRowDelete = "OnBeforeRowDelete";
DataGridEvent.OnAfterRowInserted = "OnAfterRowInserted";
DataGridEvent.OnAfterRowDeleted = "OnAfterRowDeleted";
DataGridEvent.OnCellFocusEnter = "OnCellFocusEnter";
DataGridEvent.OnCellFocusOut = "OnCellFocusOut";
DataGridEvent.OnBeforeCellFocusEnter = "OnBeforeCellFocusEnter";

//行 copy 功能
DataGridEvent.OnAfterRowCopyed = "OnAfterRowCopyed";
DataGridEvent.OnBeforeRowCopy = "OnBeforeRowCopy";
DataGridEvent.OnRowCopy = "OnRowCopy";
DataGridEvent.OnGridHeadClick = "OnGridHeadClick";
DataGridEvent.OnCellClick = "OnCellClick";
DataGridEvent.OnCellDBClick = "OnCellDbClick";
DataGridEvent.OnRowChanged = "OnRowChanged";
获取行DatagridView控件
//DataGrid4为页面DataGridView控件名称,可使用F12找到DataGridView控件名称。
IUFDataGrid dataGrid = (IUFDataGrid)part.GetUFControlByName(part.TopLevelContainer, "DataGrid4");

业务场景:单元格数量改变callback

使用callback举例,开发人员可使用postback实现一次。所有callback实现的多种场景案例大部分代码都类似。如果是插件的开发,需要先获取到行DataGridView控件,插件里面把下方的this改成插件的part即可
public void AfterCreateChildControls() //插件注册到AfterInit()
{
    //注册callback事件,调BP获取料品单价
    RegisterGridCellDataChangedCallBack();
}

#region 回调注册\处理专区

/// <summary>
/// 注册表格单元格内容改变的回调事件
/// </summary>
private void RegisterGridCellDataChangedCallBack()
{
    AssociationControl gridCellDataChangedASC = new AssociationControl(); //基本固定代码
    gridCellDataChangedASC.SourceServerControl = this.DataGrid8;
    gridCellDataChangedASC.SourceControl.EventName = "OnCellDataChanged"; //注册行的单元格改变事件

    //CallBack处理方案
    ((IUFClientAssoGrid)gridCellDataChangedASC.SourceControl).FireEventCols.Add("Item"); //触发源,Item为触发控件名称
    ClientCallBackFrm gridCellDataChangedCBF = new ClientCallBackFrm();
    gridCellDataChangedCBF.ParameterControls.Add(this.DataGrid8);
    gridCellDataChangedCBF.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(gridCellDataChangedCBF_DoCustomerActionOfSubvillage);
    gridCellDataChangedCBF.Add(gridCellDataChangedASC);
    this.Controls.Add(gridCellDataChangedCBF);
}

/// <summary>
/// 表格的CallBack处理方式
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
private object gridCellDataChangedCBF_DoCustomerActionOfSubvillage(CustomerActionEventArgs args)
{
    UFWebClientGridAdapter grid = new UFWebClientGridAdapter(this.DataGrid8); //行的DataGrid控件

    //取表格数据(当前行)
    ArrayList list = (ArrayList)args.ArgsHash[UFWebClientGridAdapter.ALL_GRIDDATA_SelectedRows]; //基本固定代码
    int curIndex = int.Parse(list[0].ToString());
    Hashtable table = (Hashtable)((ArrayList)args.ArgsHash[this.DataGrid8.ClientID])[curIndex];
    long ItemID = long.Parse(table["Item"].ToString()); //获取触发源字段值

    if (ItemID > 0)
    {
        // .......(略)写自己的业务逻辑
        //单价
        grid.CellValue.Add(new object[] { curIndex, "UnitPrice", new string[] { "XXX", "YYY", "ZZZ" } }); //UnitPrice为要更新的字段名称,如果要更新多个字段值,需要些多个Add。后面三个参数,如果为参照的话分别对应ID,Code,Name
        args.ArgsResult.Add(grid.ClientInstanceWithValue);
        // ..........(略)
    }
    return args;
}

#endregion

业务场景:行数值计算postback

private void Register_DataGrid_Qty_PoskBack()
{
    AssociationControl assocControl = new AssociationControl();
    assocControl.SourceServerControl = this.DataGrid0;
    assocControl.SourceControl.EventName = "OnCellDataValueChanged"; //注册单元格改变事件
    ((IUFClientAssoGrid)assocControl.SourceControl).FireEventCols.Add("ApsQty"); //触发列

    CodeBlock cb = new CodeBlock();
    UFWebClientGridAdapter gridAdapter = new UFWebClientGridAdapter(this.DataGrid0);
    gridAdapter.IsPostBack = true;
    gridAdapter.PostBackTag = "OnCellDataValueChanged"; //同上
    cb.TargetControls.addControl(gridAdapter);
    assocControl.addBlock(cb);

    UFGrid itemGrid = this.DataGrid0 as UFGrid;
    itemGrid.GridCustomerPostBackEvent += new GridCustomerPostBackDelegate(_Qty_GridCustomerPostBackEvent);
}

void _Qty_GridCustomerPostBackEvent(object sender, GridCustomerPostBackEventArgs e)
{
    if (e.SrcColumnName != "ApsQty") //触发源字段=ApsQty时才执行下面的逻辑
        return;

    string oldProductCode = this.Model.PlanOrderAPS.FocusedRecord.ProductionLine_Code;
    if (oldProductCode == "")
        return;

    this.OnDataCollect(this);
    this.IsDataBinding = true; //当前事件执行后会进行数据绑定
    this.IsConsuming = false;
    this.DataGrid0.CollectData();
    this.DataGrid0.BindData();

    PlanOrderAPSRecord record = this.Model.PlanOrderAPS.FocusedRecord;
    record.XXX = YYY; //赋值
}

业务场景:选择数据新增行(多选实现)postback

选择料品后,可以根据料品信息新增单据行,并带出其他信息
public void AfterCreateChildControls()
{
    //注册callback事件,调BP获取料品单价
    RegisterGridCellDataChangedPostBack();
}

/// <summary>
/// 注册表格单元格内容改变的回调事件
/// </summary>
private void RegisterGridCellDataChangedPostBack()
{
    AssociationControl assocControl = new AssociationControl();
    assocControl.SourceServerControl = this.DataGrid5;
    assocControl.SourceControl.EventName = "OnCellDataValueChanged";
    ((IUFClientAssoGrid)assocControl.SourceControl).FireEventCols.Add("Gift");

    CodeBlock cb = new CodeBlock();
    UFWebClientGridAdapter gridAdapter = new UFWebClientGridAdapter(this.DataGrid5);
    gridAdapter.IsPostBack = true;
    gridAdapter.PostBackTag = "OnCellDataValueChanged";
    cb.TargetControls.addControl(gridAdapter);
    assocControl.addBlock(cb);

    UFGrid itemGrid = this.DataGrid5 as UFGrid;
    itemGrid.GridCustomerPostBackEvent += new GridCustomerPostBackDelegate(GridCell_GridCustomerPostBackEvent);
}

private void GridCell_GridCustomerPostBackEvent(object sender, GridCustomerPostBackEventArgs e)
{
    if (e.PostBackTag == "OnCellDataValueChanged")
    {
        DataTable dt = this.CurrentState["CustItem_Table"] as DataTable;
        if (dt == null)
        {
            this.DataGrid5.CollectData();
            this.DataGrid5.BindData();
            return;
        }

        CurrentState.Remove("CustItem_Table");

        //校验DT是否为空
        if (dt.Rows.Count < 1)
        {
            this.DataGrid5.CollectData();
            this.DataGrid5.BindData();
            return;
        }

        //获取最后的行号
        int rowNo = 10;
        int recordsCount = this.Model.GiftShip_GiftShipLine.RecordCount;
        if (recordsCount != 0)
        {
            rowNo = Convert.ToInt32(this.Model.GiftShip_GiftShipLine.Records[recordsCount - 1]["RowNO"]);
        }

        //若只返回一条,做数据收集即可
        if (dt.Rows.Count == 1)
        {
            DataGrid5.CollectData();
            DataGrid5.BindData();
        }

        //循环传回来的表体,//当多选参照界面点击确定返回时,Model默认添加了第一条记录,故不做处理
        for (int i = 1; i < dt.Rows.Count; i++)
        {
            GiftShip_GiftShipLineRecord rd = this.Model.GiftShip_GiftShipLine.AddNewUIRecord();
            rd.Gift = !string.IsNullOrEmpty(Convert.ToString(dt.Rows[i]["ItemID"])) ? long.Parse(Convert.ToString(dt.Rows[i]["ItemID"])) : 0;
            rd.Gift_Code = Convert.ToString(dt.Rows[i]["ItemCode"]);
            rd.Gift_Name = Convert.ToString(dt.Rows[i]["ItemName"]);
            //..........(略)
        }

        this.DataCollect();
        this.DataBind();
        // rd.SetParentRecord(this.Model.GiftShip.FocusedRecord); // Note: 'rd' is out of scope here.
        DataGrid5.CollectData();
        DataGrid5.BindData();
    }
}


//弹窗页面点击确定后执行如下方法将选择的数据放到table缓存到session里面:
private void ReturnSelectedValue()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ID", typeof(long));
    dt.Columns.Add("Code", typeof(string));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("PurchaseUOM_ID", typeof(long));
    dt.Columns.Add("PurchaseUOM_Code", typeof(string));
    dt.Columns.Add("PurchaseUOM_Name", typeof(string));

    foreach (IUIRecord _frd in this.Model.cRef.SelectRecords)
    {
        DataRow dr = dt.NewRow();
        dr["ID"] = _frd["ID"];
        dr["Code"] = _frd["Code"];
        dr["Name"] = _frd["Name"];
        dr["PurchaseUOM_ID"] = _frd["PurchaseUOM_ID"];
        dr["PurchaseUOM_Code"] = _frd["PurchaseUOM_Code"];
        dr["PurchaseUOM_Name"] = _frd["PurchaseUOM_Name"];
        dt.Rows.Add(dr);
    }
    this.CurrentState["CustItem_Table"] = dt;
}

业务场景:行参照根据其他字段过滤

private void GridFilterCallBackEvents()
{
    IUFDataGrid uFControlByName = this.DataGrid5;
    AssociationControl control = new AssociationControl();
    control.SourceServerControl = uFControlByName;
    control.SourceControl.EventName = "OnBeforeCellFocusEnter";
    ((UFWebClientGridAdapter)control.SourceControl).FireEventCols.Add("CurrentBin");

    ClientCallBackFrm child = new ClientCallBackFrm();
    child.DoCustomerAction += assoCGrid_DoBeforePackAction;
    child.ParameterControls.Add(uFControlByName);
    child.Add(control);
    this.Controls.Add(child);
}

private object assoCGrid_DoBeforePackAction(CustomerActionEventArgs args)
{
    string str2 = string.Empty;
    IUFDataGrid uFControlByName = this.DataGrid5;
    int num = Convert.ToInt32(args.ArgsHash[UFWebClientGridAdapter.FocusRow]);

    if (num >= 0)
    {
        ArrayList list = (ArrayList)args.ArgsHash[uFControlByName.ClientID];
        Hashtable hashtable = (Hashtable)list[num];

        if (args.ArgsHash["ALL_GRIDDATA_FocusColumnName"].ToString() == "CurrentBin")
        {
            UFWebClientGridAdapter adapter;
            try
            {
                if (hashtable["CurrentWH"] != null && hashtable["CurrentWH"].ToString() != "" && hashtable["CurrentWH"].ToString() != "-1")
                {
                    str2 = " Warehouse =" + hashtable["CurrentWH"].ToString() + "";
                    adapter = new UFWebClientGridAdapter(uFControlByName);
                    adapter.ResetColumnEditorAttribute("CurrentBin", UFWebClientRefControlAdapter.Attributes_AddParam, new string[] { "UBF_CustomFilter", str2 });
                    args.ArgsResult.Add(adapter.ClientInstanceWithRefAddParam);
                    return args;
                }
            }
            catch (Exception)
            {
                adapter = new UFWebClientGridAdapter(uFControlByName);
                adapter.ResetColumnEditorAttribute("CurrentBin", UFWebClientRefControlAdapter.Attributes_AddParam, new string[] { "UBF_CustomFilter", "ID=-1" });
                args.ArgsResult.Add(adapter.ClientInstanceWithRefAddParam);
                return args;
            }
        }
    }
    return args;
}

 

根据行上某个字段判断,让另外一个显示不同的参照

参照的案例是材料出库行“来源单据类型和”来源单据“列。
事件注册在AfterCreateChildControls,插件注册在AfterInit中,示例如下:
核心思路就是,UBF的Model中要增加多个自定义字段,绑定不同的实体;
在UBF UIForm中绑定好各自的参照,隐藏掉;代码里面把显示的列参照根据条件替换成隐藏列的参照
private void CallBack_SrcDoc()
{
    AssociationControl assoCGrid = new AssociationControl();
    assoCGrid.SourceServerControl = this.DataGrid8;
    assoCGrid.SourceControl.EventName = "OnBeforeCellFocusEnter";
    ((IUFClientAssoGrid)assoCGrid.SourceControl).FireEventCols.Add("SourceDocNo");

    UFWebClientGridAdapter grid = new UFWebClientGridAdapter(this.DataGrid8);
    CodeBlock codeBlock = new CodeBlock();
    string sourceDocType = grid.getSelectedValueText("SourceDocType");
    string expression = string.Empty;

    expression += "if( ";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType");
    expression += " =='1')";
    codeBlock.Condition = expression;
    grid.SwitchColumnControl("IssueApplyDocLine4SrcDoc", "SourceDocNo"); //IssueApplyDocLine4SrcDoc为申请单的参照控件
    codeBlock.TargetControls.addControl(grid);
    assoCGrid.addBlock(codeBlock);

    codeBlock = new CodeBlock();
    expression = " else if( ";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType");
    expression += " =='-1')";
    codeBlock.Condition = expression;
    UFWebClientGridAdapter grid2 = new UFWebClientGridAdapter(this.DataGrid8);
    grid2.SwitchColumnControl("SourceDocNo", "SourceDocNo"); //SourceDocNo为备料参照控件
    codeBlock.TargetControls.addControl(grid2);
    assoCGrid.addBlock(codeBlock);

    codeBlock = new CodeBlock();
    expression = " else if( ";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType");
    expression += " =='2')";
    codeBlock.Condition = expression;
    UFWebClientGridAdapter grid3 = new UFWebClientGridAdapter(this.DataGrid8);
    grid3.SwitchColumnControl("IssueApplyDocLineSum4SrcDoc", "SourceDocNo"); //IssueApplyDocLineSum4SrcDoc为领料申请汇总参照控件
    codeBlock.TargetControls.addControl(grid3);
    assoCGrid.addBlock(codeBlock);

    codeBlock = new CodeBlock();
    expression = " else if( (";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType");
    expression += " =='0') && (";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("BizType");
    //expression += " =='47')";
    expression += " !='52')";
    expression += ")";
    codeBlock.Condition = expression;
    UFWebClientGridAdapter grid4 = new UFWebClientGridAdapter(this.DataGrid8);
    grid4.SwitchColumnControl("MOPick4SrcDoc", "SourceDocNo");
    codeBlock.TargetControls.addControl(grid4);
    assoCGrid.addBlock(codeBlock);

    codeBlock = new CodeBlock();
    expression = " else if( (";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("SourceDocType");
    expression += " =='0') && (";
    expression += new UFWebClientGridAdapter(this.DataGrid8).getSelectedValuePK("BizType");
    expression += " =='52')";
    expression += ")";
    codeBlock.Condition = expression;
    UFWebClientGridAdapter grid5 = new UFWebClientGridAdapter(this.DataGrid8);
    grid5.SwitchColumnControl("PLSPick4SrcDoc", "SourceDocNo");
    codeBlock.TargetControls.addControl(grid5);
    assoCGrid.addBlock(codeBlock);
}

 

业务场景:表头字段更新其他字段的值

private void CallBack_UomTab_ProductQtyby()
{
    AssociationControl assoC_ProductQty = new AssociationControl();
    // 生产数量
    assoC_ProductQty.SourceServerControl = this.ProductQty196;
    assoC_ProductQty.SourceControl.EventName = "OnValueChanged";

    ClientCallBackFrm cF = new ClientCallBackFrm();
    cF.ParameterControls.Add(this.ProductQty196); //看自己需要可以注册多个控件
    // cF.ParameterControls.Add(this.ProductQty1);
    // cF.ParameterControls.Add(this.PUToPBURate166);
    /// cF.ParameterControls.Add(this.PBUToSBURate91);
    cF.DoCustomerAction += new ClientCallBackFrm.ActionCustomer(onUOMTabProductQtyCallBackAction);
    cF.Add(assoC_ProductQty);
}

object onUOMTabProductQtyCallBackAction(CustomerActionEventArgs args)
{
    // 生产数量
    decimal ProductQty = args.ArgsHash[this.ProductQty196.ClientID].ToString().Equals("") ?
        1 :
        decimal.Parse(args.ArgsHash[this.ProductQty196.ClientID].ToString());

    // Assuming ProductQtyByProductUOM is defined elsewhere in your code.
    // decimal ProductQtyByProductUOM = ...; 

    args.ArgsResult.Add(new UFWebClientNumberAdapter(this.ProductQty1).ClientInstance + ".set_Value('" + ProductQty.ToString() + "')");
    return args;
}
0

评论

博主关闭了当前页面的评论