Table of Contents

如何使用脚本 UI 帮助程序

Tabular Editor 提供了一些用于脚本中用户交互的辅助方法:显示输出、显示信息、提示选择对象、对 DAX 求值,以及构建自定义对话框。 在桌面 UI 中,这些方法会弹出图形化对话框。 在 CLI 中,它们会输出到控制台。

快速参考

// Messages
Info("Operation completed.");                          // informational popup
Warning("This might take a while.");                   // warning popup
Error("No valid selection."); return;                  // error popup + stop script

Output("Hello");                                       // simple dialog

// Object selection dialogs (capture returns for reuse below)
var table = SelectTable();                             // pick a table
var column = SelectColumn(table.Columns);              // pick from filtered columns
var measure = SelectMeasure();                         // pick a measure
var ds = SelectObject<DataSource>(Model.DataSources);  // generic selection
var items = SelectObjects(Model.AllMeasures);          // multi-select (TE3 only)

// Evaluate DAX
var result = EvaluateDax("COUNTROWS('Sales')");        // run DAX on connected model

// Output (uses the variables assigned above)
Output(measure);                                       // property grid for a TOM object
Output(items);                                         // list view with property grid
Output(result);                                        // sortable/filterable grid for a DataTable

信息:信息、警告、错误

用于简单沟通。 Error() 本身不会停止脚本执行——如果想要中止执行,请在后面加上 return

if (Selected.Measures.Count() == 0)
{
    Error("Select at least one measure before running this script.");
    return;
}

// ... do work ...
Info("Updated " + Selected.Measures.Count() + " measures.");

输出

Output() 的行为会因参数类型而异:

参数类型 行为
TOM 对象(例如 Measure 可用于查看和编辑的属性网格
IEnumerable<TabularNamedObject> 带属性网格的列表视图
DataTable 可排序、可筛选的网格
字符串或基本类型 简单的信息对话框
Note

字符串输出使用 Windows 行结束符。 使用 \r\nEnvironment.NewLine 来插入换行符。 单独的 \\n 会渲染为一行。 这会让使用 M 表达式的用户很容易踩坑:它们使用 \\n,但在 Output() 中会被打印成一行。

用于结构化输出的 DataTable

using System.Data;

var result = new DataTable();
result.Columns.Add("Measure");
result.Columns.Add("Table");
result.Columns.Add("Token Count", typeof(int));

foreach (var m in Model.AllMeasures)
{
    result.Rows.Add(m.DaxObjectName, m.Table.Name, m.Tokenize().Count);
}

Output(result);
Tip

为数值列指定 typeof(int)typeof(double),以便在输出网格中正确排序。

对象选择对话框

选择辅助方法会显示一个列表对话框,并返回用户的选择。 如果用户取消操作,它们会抛出异常。 请在 try/catch 中调用它们。

try
{
    var table = SelectTable(Model.Tables, null, "Select a table:");
    var column = SelectColumn(
        table.Columns.Where(c => c.DataType == DataType.DateTime),
        null,
        "Select a date column:"
    );
    Info($"You selected {table.Name}.{column.Name}");
}
catch
{
    Error("Selection cancelled.");
}

多选(仅限 Tabular Editor 3)

Note

SelectObjects() 仅在 Tabular Editor 3 中可用。 在 Tabular Editor 2 中,可以在循环中使用单选对话框,或在运行脚本前先筛选选中的对象。

SelectObjects() 允许用户选择多个对象。

try
{
    var measures = SelectObjects(
        Model.AllMeasures.Where(m => m.IsHidden),
        null,
        "Select measures to unhide:"
    );
    foreach (var m in measures)
        m.IsHidden = false;
}
catch
{
    Error("No selection made.");
}

评估 DAX

EvaluateDax() 会针对以连接模式连接的模型执行 DAX 表达式并返回结果。

var rowCount = Convert.ToInt64(EvaluateDax("COUNTROWS('Sales')"));
Info($"Sales table has {rowCount:N0} rows.");

// Return a table result
var result = EvaluateDax("ALL('Product'[Category])");
Output(result);
Note

EvaluateDax() 需要与 Analysis Services 或 Power BI 实例保持活动连接。 离线编辑模型时无法使用。

卫语句模式

在脚本运行前验证前置条件。

// Require at least one column or measure
if (Selected.Columns.Count() == 0 && Selected.Measures.Count() == 0)
{
    Error("Select at least one column or measure.");
    return;
}

// Smart single-or-select pattern
DataSource ds;
if (Selected.DataSources.Count() == 1)
    ds = Selected.DataSource;
else
    ds = SelectObject<DataSource>(Model.DataSources, null, "Select a data source:");

自定义 WinForms 对话框

如果内置辅助方法无法满足你的输入场景,可以直接在脚本中构建自定义 WinForms 对话框。 有关简单提示、带验证的多字段表单以及可重用对话框类的实现模式,请参阅 @how-to-build-custom-winforms-dialogs。

另见