12.事件

Supcan Report的OnEvent( id, Event, p1, p2, p3, p4 )事件含义及参数分别如下：

分类 | Event | 含义 | p1 | p2 | p3 | p4
--- | --- | --- | --- | --- | --- | ---
键盘鼠标动作 | SelChanged | 选中了单元格 | 行号 | 列号 |  |
选中了内嵌对象 | 别名 |  |  |
Clicked | 鼠标点到某单元格 | 行号 | 列号 |  |
备注：如果是交叉表, 可以继续用 GetCellProp 函数获取该单元格的 crosstabRowDir、crosstabColDir 属性, 即所在的交叉项
鼠标点在单元格右侧的按钮上 | 行号 | 列号 | RightButton |
备注：请参见函数 SetCellProp/GetCellProp
鼠标点到某统计图 | 统计图别名 | 系列名 | 数据项名 | 数据所在的单元格名称 如果是多工作表, 则在后面跟随有类似 "@sheet1" 的宏
鼠标点到某内嵌对象 | 别名 |  |  |
鼠标点在某内嵌对象右侧的按钮上 | 别名 |  | RightButton |
备注：请参见函数 SetCellProp/GetCellProp
Clicked (超链接的兼容模式, 见备注5) | 鼠标点到某超链接的单元格 | 行号 | 列号 | 超链接的标识文字 | 数据源超链接的列ID (如果是数据源的超链接)
鼠标点到定义了超链接的交叉表的单元格 | 行号 | 列号 | Crosstab | 交叉表中该值的“副标题文字”
HyperLink 超链接事件 | 鼠标点到某超链接的单元格 | 行号 | 列号 | 超链接的标识文字 | 数据源超链接的列ID (如果是数据源的超链接)
交叉表单元格的超链接 | 行号 | 列号 | Crosstab | 交叉表中该值的“副标题文字”
将跳转到另一个工作表 | 行号 | 列号 | go | 工作表名
备注：可执行全局函数CalcelEvent( )阻止继续执行
将跳转到另一个工作表并对其执行计算 | 行号 | 列号 | goCalc | 工作表名
备注：可执行全局函数CalcelEvent( )阻止继续执行
将计算所有工作表 | 行号 | 列号 | calc |
备注：可执行全局函数CalcelEvent( )阻止继续执行
DblClicked | 鼠标双击某单元格 | 行号 | 列号 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
EditChanged | 单元格内容被修改 | 行号 | 列号 | 输入前的内容 |
备注1：通常是输入框关闭(焦点离开)后才触发该事件的; 备注2：在执行粘贴(Paste)时，也会触发该事件，每个单元格都会触发一遍, 如果您执行了 CancelEvent 函数，那么粘贴过程将终止
文本框内容被修改 | 别名 |  | 输入前的内容 |
备注：通常是输入框关闭(焦点离开)后才触发该事件的
Editing | 正打开着的单元格的输入框内容有变 | 行号 | 列号 | 当前内容串 |
备注：在输入过程中，输入内容并不会立即更新到单元格中
正打开着的文本框的输入框内容有变 | 别名 |  | 当前内容串 |
备注：在输入过程中，输入内容并不会立即更新到单元格中
Keydown | 在非编辑状态时的键盘动作 |  |  | 键的ASCII码，例如回车是13、空格是32 | 见备注2
备注1：可执行全局函数CalcelEvent( )阻止继续执行 备注2：p4的含义为: 1-Ctrl键也按下了； 2-Shift键也按下了； 3-二者一起按下了
Checked | 鼠标选了Checkbox | 行号 | 列号 | Checkbox的值(1/0) |
OtherDictButtonClicked | 鼠标点击了工具箱字典选项卡中的 "外部字典" 按钮 | 行号 | 列号 | 单元格的外部字典的 ID 号 |
OtherDictClicked | 鼠标点击了有外部字典的单元格 | 行号 | 列号 | 单元格的外部字典的 ID 号 | 单元格的显示串 (注: 值串请通过 GetCellData 函数获取)
文件IO事件 | New | 报表已新建 (即点击了工具条左上角第一个按钮) |  |  |  |
备注："Toolbar" 事件发生在新建前; "New" 事件发生在新建后
Opened | 已打开报表 | 报表的URL, 也可能是纯数字串形式的内存块句柄(可用全局函数 GetDataString 访问) |  |  |
Saved | 报表已保存 | 本地的全文件名 | 如果一开始打开的是zip文件，则为该zip文件名 |  |
Exported | 报表已转换输出 | 全文件名(多个文件以逗号分隔) | 文件类型(即后缀) |  |
ExportDialog | 转换输出对话框中，当用户点击"确定"后、文件对话框即将弹出前 | 文件后缀 | 以逗号分隔的、待转换的工作表序号(从0开始计数) |  |
备注：可以在该事件中执行 SetExportFilename 函数，详见该函数的说明.
AutoCalc | 报表需要立即执行计算 |  |  |  |
行列增删 | RowInserted | 行已插入 | 行号 | 数量 |  |
BeforeRowInserted | 行插入前 | 行号 | 数量 |  |
RowDeleted | 行已删除 | 行号 | 数量 |  |
BeforeRowDeleted | 行删除前 | 行号 | 数量 |  |
ColInserted | 列已插入 | 列号 | 数量 |  |
BeforeColInserted | 列插入前 | 列号 | 数量 |  |
ColDeleted | 列已删除 | 列号 | 数量 |  |
BeforeColDeleted | 列删除前 | 列号 | 数量 |  |
工具条和工具箱 | Toolbar | 鼠标点击了工具条中的某按钮、但尚未执行 | 功能号 | 参数，和功能号有关 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
ToolbarRun | 鼠标点击了工具条中的某按钮、且已成功执行 | 功能号 | 参数，同 Toolbar 事件 |  |
备注：如果某些功能是需要弹出对话框确认的，那么点击对话框的 “取消” 是不会触发本事件的，此外，如果功能没有得到执行时，也不触发本事件
BeforeCellPropChanged | 工具箱中单元格的某些属性被改动前 | 单元格名 | 属性名称 | 修改前的内容 | 修改后的内容
备注1：可执行全局函数CalcelEvent( )阻止继续执行; 备注2：并不是所有属性都会触发该事件，只有常用的属性诸如颜色、保护、对齐等等才触发
CellPropChanged | 工具箱中单元格的某些属性已被改动 | 单元格名 | 属性名称 | 修改前的内容 | 修改后的内容
BeforeFunctionDrag | 工具箱中 “函数” 选项卡中，某函数被拖拽到单元格前 | 单元格名 | 函数名 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
FunctionDrag | 工具箱中 “函数” 选项卡中，某函数被拖拽到单元格后 | 单元格名 | 函数名 |  |
BeforeDSDrag | 工具箱中 “数据源” 选项卡中，某函数被拖拽到单元格前 | 单元格名 | 函数名 | 逗号分隔的参数 |
备注：可执行全局函数CalcelEvent( )阻止继续执行
DSDrag | 工具箱中 “数据源” 选项卡中，某函数被拖拽到单元格后 | 单元格名 | 函数名 | 逗号分隔的参数 |
BeforeItemDrag | 工具箱中 “指标库” 选项卡中，某指标被拖拽到单元格前 | 单元格名, 如果为空表示是拖拽成文本框 | 指标名 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
ItemDrag | 工具箱中 “指标库” 选项卡中，某指标被拖拽到单元格后 | 单元格名, 如果为空表示是拖拽成文本框 | 指标名 |  |
工作表 | WorkSheetSelChanged | 当前工作表已切换 | 工作表序号 | 0 - 普通鼠标点击时切换; 1 - 报表刚打开时自动触发本事件 |  |
BeforeSheetDeleted | 工作表被删除前 | 工作表序号 |  |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
SheetDeleted | 工作表已经被删除 | 工作表序号 |  |  |
BeforeSheetRenamed | 工作表被改名前 | 工作表序号 | 原名 | 新名 |
备注：可执行全局函数CalcelEvent( )阻止继续执行
SheetRenamed | 工作表已经被改名 | 工作表序号 | 原名 | 新名 |
BeforeSheetInserted (点击了选项卡 ) | 工作表新建前 |  |  |  |
新工作表导入前 | 报表的URL | 工作表数量 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
SheetInserted (点击了选项卡 ) | 新建了工作表 |  |  |  |
导入了新工作表 | 报表的URL | 工作表数量 |  |
打印相关 | BeforePrint | 正准备要打印 (在预览界面) |  |  |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
Printed | 已打印 (是指打印任务已经发送给操作系统的打印任务队列) | 已打印次数 | 0 - 普通打印; 1 - 在预览窗口中的打印当前页; 2 - 在预览窗口中的打印全部页; |  |
Previewed | 打印预览窗口已关闭 |  |  |  |
PrintSetupBeforeUpdate | 打印参数设置对话框已经按下"确认", 但尚未更新到报表 | 即将要更新的新的配置串(XML串) |  |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
PrintSetupUpdated | 打印参数设置对话框已经按"确认"关闭, 并且已经更新到报表 |  |  |  |
计算相关 | Calced | 已执行计算 | 0 - 执行了工具条上的“重新计算”; 1 - 执行了"除数据源外，重新计算"; 2 - API执行了计算函数; 3 - API执行了当前工作表的计算 | 0 - 是同步计算 1 - 是异步计算 注：工具条上的“计算”按钮是异步计算 |  |
DataReach | 数据源已经访问了http并得到了数据，但尚未应用该数据 | 纯数字串形式的内存块的句柄 | URL | 数据源的ID, 如"ds1" |
备注1：可以用全局函数 GetDataString / SetDataString 取得或更改内存块中的数据 备注2：可以用上述2个函数存取数据，但不宜过多调用其它函数，否则会造成不稳定
其它 | HotKey | 触发了快捷键 | 快捷键 | 如果当前选中的是单元格，为所在行号; 如果是内嵌对象，则为它的别名 | 当前单元格的列号, 如果有单元格选中的话 |
MenuBeforePopup | 右键菜单即将弹出(单元格) | 行号 | 列号 |  |
右键菜单即将弹出(文本框/统计图/图片等) | 别名，多个别名间以逗号分隔 |  |  |
备注：在 Chrome 浏览器下必须配合 MenuBeforePopup_Lock / MenuBeforePopup_UnLock 函数使用, 请参考这些函数的文档
MenuClicked | 右键菜单的自定义部分被选中 | 功能号 | 行号 | 列号 |
SelectEcharts | 选择 ECharts 统计图 | 统计图句柄 | 示例图样(SamplePage)名 | 主题(Theme)名 | 0 - 新建统计图 1 - 修改统计图
UserEvent | 全局函数 PostMessage 发出的自定义事件 | 自定义 | 自定义 | 自定义 | 自定义
Device | 设备事件(如扫描仪) | Twain - 表示是扫描仪的事件 | 1 - 扫描成功 2 - 用户取消了操作 3 - 文件写入失败 4 - 未发现可用扫描仪 | 扫描仪扫描成功的文件名, 多个文件间以回车符分隔 |
CacheSaved | 全局事件，请参见全局函数 ListenEvent | 缓存的ID |  |  |
Download | 全局事件，请参见Freeform组件的同名事件 |  |  |  |
Upload | 全局事件，请参见Freeform组件的同名事件 |  |  |  |
树列表别名.树列表事件名 | 内嵌树列表的事件 | 参见树列表 | 参见树列表 | 参见树列表 | 参见树列表

备注1：行列增删“前”的4个事件(BeforeRowInserted、BeforeColInserted、BeforeRowDeleted、BeforeColDeleted)，是用户交互过程中触发的，增删行列的函数是不会触发该事件的；
备注2：在行列增删“前”事件、以及BeforeCellPropChanged事件中，你可以通过全局函数 CancelEvent 去阻止下一步的行列增删动作，如下例：

    function OnEvent(id, Event, p1, p2, p3, p4)
    {
     if(Event == "BeforeRowInserted") {
      AF.func("CancelEvent", "");  //阻止插入行
     }
    }

备注3：SelChanged、Clicked、DblClicked 和 EditChanged、Editing、CellPropChanged事件需要SubscribeEvent( )预订才会生效, 事件的js用法可参见下例：

    function OnReady( id )
    {
     AF.func( 'Build', 'index.XML' );　　　　　//加载报表
     AF.func("SubscribeEvent", "SelChanged, EditChanged");　　//预订事件
    }
    function OnEvent(id, Event, p1, p2, p3, p4)
    {
     if( Event == "SelChanged" ) {
      //...略
     }
    }

备注4：Checked事件必须要先预订 Clicked 事件才能生效；
备注5：SelectEcharts事件要先预订才能生效, 预定后系统将不会弹出选择 EChart 的对话框, 通常用于用户自定义开发.
备注6：关于超链接事件, 在1.0.101.0前, 都是和 "Clicked" 事件同名的, 在1.0.101.0版本后, 超链接允许设置多种行为方案了, 在工具箱超链接的输入处右侧有一个小按钮, 点击后会弹出一个对话框:
您可以在此选择, 其中第一个是兼容模式, 用于和以前版本兼容, 即触发 Clicked 事件还是打开 URL, 取决与您是否预订了 Clicked 事件.
第二个 “打开这个 URL” 是不触发页面事件的, 它将直接打开新的页面.
其余 4 种模式将触发 "HyperLink" 事件, 不再触发 "Clicked" 事件.