Page tree
Skip to end of metadata
Go to start of metadata

1.描述

在一些情况下,单元格值变化后,单元格类型需要变更。比如在树型图插件中,如果查询条件变更,则树型图的节点也需要更新。

需要使用IDependenceCells接口来实现插件动态数据更新。

2.单元格值改变时更新单元格类型插件

操作步骤

  实现接口IDependenceCells ,并列举所有有依赖的单元格。

namespace MyListCellType
{
    [Designer("MyListCellType.MyListCellTypeDesigner,MyListCellType")]
    public class MyListCellType : CellType
    {
        public string TableName
        {
            get; set;
        }
        public string TextColumn
        {
            get; set;
        }
        [FormulaProperty]
        public object SimpleQueryCell
        {
            get; set;
        }
    }
    
    public class MyListCellTypeDesigner : CellTypeDesigner<MyListCellType>, IDependenceCells
    {
        public override EditorSetting GetEditorSetting(PropertyDescriptor property, IBuilderContext builderContext)
        {
            if (property.Name == "TableName")
            {
                return new TableComboTreeSelectorEditorSetting();
            }
            if (property.Name == "TextColumn")
            {
                var columns = builderContext.EnumAllTableInfos().FirstOrDefault(t => t.TableName == this.CellType.TableName)?.Columns?.Select(c => c.ColumnName);
                return new ComboEditorSetting(columns);
            }
            if (property.Name == "ValueColumn")
            {
                var columns = builderContext.EnumAllTableInfos().FirstOrDefault(t => t.TableName == this.CellType.TableName)?.Columns?.Select(c => c.ColumnName);
                return new ComboEditorSetting(columns);
            }
            return base.GetEditorSetting(property, builderContext);
        }

        public override FrameworkElement GetDrawingControl(ICellInfo cellInfo, IDrawingHelper drawingHelper)
        {
            ListBox listBox = new ListBox();
            //get table data for preview.
            var tableData = drawingHelper.GetTableDataForPreview(this.CellType.TableName, new List<string>() { this.CellType.TextColumn }, null, true);
            if (tableData != null)
            {
                foreach (var row in tableData)
                {
                    var value = row[this.CellType.TextColumn];
                    if (value != null)
                    {
                        ListBoxItem item = new ListBoxItem() { Content = value };
                        listBox.Items.Add(item);
                    }
                }
            }
            Grid container = new Grid();
            container.Children.Add(listBox);
            return container;
        }
        
        public IEnumerable<object> EnumDependenceCells(IBuilderContext context)
        {
            return context.EnumDependenceCellsFromFormula(this.CellType.SimpleQueryCell);
        }
    }
}

在这个示例中,您可以使用IBuilderContext.EnumDependenceCellsFromFormula(object formula)来列举所有有依赖的单元格,您还可以使用IBuilderContext.EnumDependenceCells(object queryCondition)来列举所有有依赖的单元格。

  添加onDependenceCellValueChanged回调函数如下,并重新加载列表数据。

var MyListCellType = (function (_super) {
    __extends(MyListCellType, _super);
    function MyListCellType() {
        return _super !== null && _super.apply(this, arguments) || this;
    }

    MyListCellType.prototype.createContent = function () {
        var self = this;
        var element = this.CellElement;
        var container = $("<div id='" + this.ID + "'></div>");
        var listCell = $("<ul id='" + this.ID + "_list' ></ul>");
        listCell.css("width", element.Width + "px");
        listCell.css("height", element.Height + "px");
        //初始化数据
        this.loadItems();
        container.append(listCell);

        this.onDependenceCellValueChanged(function () {    //add callback event and reload the list items
            //clear children
            $("#" + self.ID + "_list").empty();
            //重新加载数据
            self.loadItems();
        });
        return container;
    }

    MyListCellType.prototype.loadItems = function () {
        var self = this;
        var element = this.CellElement;
        var cellTypeMetaData = element.CellType;
        var dependenceCell = cellTypeMetaData.SimpleQueryCell;
        var dependenceValue = self.evaluateFormula(dependenceCell);
        var odataParam = cellTypeMetaData.TableName + "?$select=" + cellTypeMetaData.TextColumn;
        if (dependenceValue != null && dependenceValue !== "") {
            odataParam += "&$filter=contains(" + cellTypeMetaData.TextColumn + ",'" + dependenceValue + "')";
        }
        //获取数据
        Forguncy.getTableDataByOData(odataParam, function (tableData) {
            if (tableData) {
                for (var row = 0; row < tableData.length; row++) {
                    var rowData = tableData[row];
                    var text = rowData[cellTypeMetaData.TextColumn];
                    var li = $("<li>" + text + "</li>");
                    $("#" + self.ID + "_list").append(li);
                }
            }
        });
    }

    return MyListCellType;
}(Forguncy.CellTypeBase));

// Key format is "Namespace.ClassName, AssemblyName"
Forguncy.Plugin.CellTypeHelper.registerCellType("MyListCellType.MyListCellType, MyListCellType", MyListCellType);

重新构建工程并重启设计器,设置依赖单元格如下:

运行页面,当L2单元格值变化时,列表也会更新。

  • 当L2没有输入值时,显示如下:

  • 当L2输入“a”时,显示如下:

  • 当L2输入“b”时,显示如下:


回到顶部

  • No labels