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”时,显示如下:



