14.事件

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

Event | 含义 | p1 | p2 | p3 | p4
--- | --- | --- | --- | --- | ---
SelChanged | 当前行或单元格已变化(被切换) | 行号 | 列名(见备注) |  |
备注：当p2参数为空串时, 表示当前行已变化: 否则表示当前单元格已变化, 并且进入编辑状态
Clicked | 情形1: 鼠标点到某单元格 | 行号 | 列名 | 如果当前列为超链接, 则为本单元格的内容 | HyperLink
情形2: 鼠标点到某列表头 | -1 | 列名 | 1 / 0 / icon(见备注) |
备注：如果是isCheckboxOnly 列, 则p3为 1 或 0; 如果是点击在headerIcon小图标上，则p3为串icon
情形3: 鼠标点到 EditWithButton 输入框右侧的按钮 | 行号 | 列名 |  | 见备注
备注：p4参数规定为：如果当前列为 Button 型 或 editWithButton 型, 鼠标点在 button 上则为 "button"；如果列中有多个 button，那么分别为 "button1"、"button2"... 依次类推
情形4: 鼠标点到下拉 DropTreelist 弹出窗的自定义按钮上 | 行号 | 列名 | DropdownButton | 按钮的 id
DblClicked | 鼠标双击某单元格 | 行号 | 列名 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
BeforeEdit | 某单元进入编辑(输入)前 | 行号 | 列名 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
EditChanged | 某单元被修改 | 行号 | 列名 |  |
执行了右键菜单的"粘贴" | 开始行号 | 开始列名 | 结束行号 | 结束列名
备注：在编辑状态下单元格内部的右键菜单是操作系统的菜单，是不会触发本事件的
DropdownSelChanged | 某单元的下拉 Treelist 的选中行已变 | 行号 | 列名 | 1 - 数据有变化 0 - 数据无变化 |
备注：该事件和 EditChanged 不太一样, 因为下拉以后, 仍可以通过 Esc 键反悔、 不再触发 EditChanged 事件. 当然，如果您在 <properties> 中设定了 AutoUpdate="true", 那就无法用 Esc 反悔了
BeforeDropdown | 某单元的下拉 List 或下拉 Treelist 正准备下拉 | 行号 | 列名 |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行, 但仅对下拉 Treelist 有效, 对下拉 List 无效
EditKeydown | 在编辑状态时输入框的键盘动作 请见备注2 | 行号 | 列名 | 键的ASCII码，例如回车是13、空格是32 | 见备注2
备注1：EditKeydown 和 EditChar 事件均为在输入框中的键盘事件，EditKeydown 能捕获几乎所有键盘动作，包括非字符的回车、Tab等；而 EditChar 事件则以输入的字符为主，包括中文;
备注2：p4的含义为: 1-Ctrl键也按下了； 2-Shift键也按下了； 3-二者一起按下了
备注3：您可以执行全局函数 CancelEvent( ) 去阻止继续执行，就如事件没有发生过那样，但不同的ASCII码，您需要在这两个事件中挑选一个执行CancelEvent( )，具体请在演示页“12.事件”中去测试
EditChar | 在编辑状态时输入框的键盘字符 | 行号 | 列名 | 字符的ASCII码 |
备注：EditKeydown 和 EditChar 事件均为在输入框中的键盘事件，EditKeydown 能捕获几乎所有键盘动作，包括非字符的回车、Tab等；而 EditChar 事件则以输入的字符为主，包括中文;
Keydown | 在非编辑状态时的键盘动作 | 行号，如果有多行则以逗号分隔 |  | 键的ASCII码，例如回车是13、空格是32 | 见备注2
备注1：可执行全局函数CalcelEvent( )阻止继续执行
备注2：p4的含义为: 1-Ctrl键也按下了； 2-Shift键也按下了； 3-二者一起按下了
LooseFocus | 某单元刚失去焦点 | 行号 | 列名 | 导致失去焦点的动作键位值： 9 - Tab 13 - 回车 37 - left 38 - up 39 - right; 40 - down 空串 - 鼠标或其它原因导致 |
rowsInserted | 有行插入 | 新行的行号 | 数量 |  |
BeforeRowsDeleted | 有行即将被删除 | 被删行的行号, 若有多行则以\t分隔 |  |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行
rowsDeleted | 有行被删除 | 被删行的Key, 若有多行则以\t分隔 | 被删除行的原始内容(XML串), 或内存句柄(纯数字串) |  |
备注1: 未定义 key 的 Treelist 不会触发该事件; 备注2: 如果P2参数是内存句柄, 可以用全局函数 GetDataString 取得串
LazyLoad | LazyLoad="true"的单列多层树的树杈被首次点击 | 行号 | id号 (当treeformat为byId、byPid时) |  |
MenuBeforePopup | 鼠标右键菜单即将弹出 | 行号， 可能为-1 | 列名, 有可能为空 |  |
备注：在 Chrome 浏览器下必须配合 EnableEventLock 函数使用, 请参考这些函数的文档
BeforePasteCheck | 用于 byPid、鼠标勾选复制或剪切后的粘贴, 在粘贴前触发的事件 | 目标行的行号 | 0/1 - 内容来自复制/剪切 | 0/1 - 作为目标行的兄弟/儿子 |
备注1：在 Chrome 浏览器下必须配合 EnableEventLock 函数使用, 请参考这些函数的文档; 备注2：要获得当前勾选中的行，请调用函数 FindAll;
PasteCheck | 用于 byPid、鼠标勾选复制或剪切后的粘贴, 粘贴后触发 | 目标行的行号 | 0/1 - 内容来自复制/剪切 | 0/1 - 作为目标行的兄弟/儿子 | 当内容来自复制时, 新增行的行号(逗号分隔)
备注：复制的源行即勾选行，可调用函数 FindAll 去获得; 剪切粘贴不存在新增行, 也可以用 FindAll 去获得所在的行
MenuClicked | 鼠标右键菜单自定义功能被选中 | 菜单项id | 行号 | 列名 |
BeforeDragRow | 行即将被拖拽 | 被拖动的行，多个行则以逗号分隔 | 目的行 | 1/0 - 拖动到目的行的上方/下方 | 见备注2
备注1：可执行全局函数CalcelEvent( )阻止继续执行
备注2：p4参数格式为 handle=[?];asChild=true，例如串 "handle=82922093;asChild=true"，其中 handle 的含义为源 Treelist 的句柄(可通过 GetHandle 函数获得)，如果是自我拖拽，则不出现该项；asChild=true 表示作为子孙拖入，如果非子孙、或者当前非树，则不出现该项.
RequestAllPages | 需要加载全部数据，以打印或转换输出 |  |  |  |
备注：用于分页显示时
Switched | 被执行了树、列表之间的切换 |  |  |  |
备注：仅在弹出菜单时触发, 通过 js 进行切换是不会触发的
Sort | 已重新排序 (触发了排序操作) | 如果<Properties>中定义了IsRemoteSort, 则为“1”，否则是空 |  |  |
CustomAble | 用户修改了界面中与可定制(GetCustom函数)有关的内容, 如选择显示列、列宽等等 | ColHideShow - 列的显示/隐藏有变化 ColWidth - 列的宽度有变化 ColSeq - 列的左右排列次序有变化 |  |  |
备注：目前 p1 只有这几种，今后版本会继续完善.
InvalidMouseWheel | 无效的鼠标滚轮操作 | 如果顶部已经是第一行仍然要上滚，为"up"; 如果底部已经是末行仍要下滚, 则为“down” |  |  |
备注：常用于分页显示情形
Printed | 已打印 (是指打印任务已经发送给操作系统的打印任务队列) |  | 0 - 普通打印; 1 - 在预览窗口中的打印当前页; 2 - 在预览窗口中的打印全部页; |  |
Previewed | 打印预览窗已关闭 |  |  |  |
Load | 数据已经通过Load( )函数加载 | URL, 空串表示加载的是XML/JSON串 | 0-同步加载 1-异步加载 | 0-加载失败 1-加载成功 |
Imported | 刚从Excel文件导入 | 导入的起始行的行号 | 导入的总行数 |  |
ExportDialog | 转换输出对话框中，当用户点击"确定"后、文件对话框即将弹出前 | 文件后缀 |  |  |
备注：可以在该事件中执行 SetExportFilename 函数，详见该函数的说明.
MouseMoveIn | 鼠标移入某个单元格 | 行号 | 列名 |  |
备注1：<Col>设定了 MouseMoveIn 属性值才能生效
备注2：鼠标在单元格上方停留不动、停留时间超过设定的值才触发该事件
MouseMoveOut | 鼠标移出某个单元格, 和鼠标移入事件 MouseMoveIn 配对 | 行号 | 列名 |  |
UndoState | Undo状态有改变 |  |  |  |
DataReach | 已经访问了 dataURL(包括 Load 函数访问) 并得到了数据，但尚未应用该数据 | 内存块的句柄(纯数字串形式) | URL |  |
备注1：可以用全局函数 GetDataString / SetDataString 取得或更改内存块中的数据
备注2：可以用上述2个函数存取数据，但不宜过多调用其它函数，否则会造成不稳定
DropDownDataReach | 某个异步加载数据的下拉已经获得了数据并已完成加载 | 某个下拉资源的 id - 表示此下拉数据已经到达 Complete! - 所有异步下拉的数据已全部到达 |  |  |
备注1：异步访问http的下拉列表、下拉树列表在初始加载数据时触发
备注2：同步加载数据的下拉不会触发本事件
备注3：当全部异步下拉都完成加载后，本事件会再次被触发，p1是固定的串 "Complete!"
HotKey | 触发了快捷键 | 快捷键 | 当前行的行号, 如果正在输入的话 | 当前列的列名, 如果正在输入的话 |
Device | 设备事件(如扫描仪) | Twain - 表示是扫描仪的事件 | 1 - 扫描成功 2 - 用户取消了操作 3 - 文件写入失败 4 - 未发现可用扫描仪 | 扫描仪扫描成功的文件名, 多个文件间以回车符分隔 |
UserEvent | 全局函数 PostMessage 发出的自定义事件 | 自定义 | 自定义 | 自定义 | 自定义
CacheSaved | 全局事件，请参见全局函数 ListenEvent | 缓存的ID |  |  |
Download | 全局事件，请参见Freeform组件的同名事件 |  |  |  |
Upload | 全局事件，请参见Freeform组件的同名事件 |  |  |  |

在线演示中有大量的事件脚本，请自行参考。