IMAPITable::FindRow
适用于:Outlook 2013 | Outlook 2016
查找表中与特定搜索条件匹配的下一行,并将光标移动到该行。
HRESULT FindRow(
LPSRestriction lpRestriction,
BOOKMARK BkOrigin,
ULONG ulFlags
);
参数
lpRestriction
[in]指向描述搜索条件的 SRestriction 结构的指针。
BkOrigin
[in]一个书签,标识 FindRow 应开始搜索的行。 可以使用 IMAPITable::CreateBookmark 方法创建书签,也可以传递以下预定义值之一。
BOOKMARK_BEGINNING
从表的开头搜索。
BOOKMARK_CURRENT
从游标所在的表中的行中搜索。
BOOKMARK_END
从表末尾搜索。
ulFlags
[in]控制搜索方向的标志的位掩码。 可以设置以下标志:
DIR_BACKWARD
从书签标识的行向后搜索。
返回值
S_OK
查找操作成功。
MAPI_E_INVALID_BOOKMARK
BkOrigin 参数中的书签无效,因为它已被删除或超出请求的最后一行。
MAPI_E_NOT_FOUND
未找到与限制匹配的行。
MAPI_W_POSITION_CHANGED
调用成功,但操作中使用的书签不再设置为与上次使用时相同的行;如果尚未使用书签,则不再位于创建书签时的位置。 返回此警告时,应将调用处理为成功。 若要测试此警告,请使用 HR_FAILED 宏。 请参阅 使用宏进行错误处理。
备注
IMAPITable::FindRow 方法查找表中的第一行,以匹配 lpRestriction 参数指向的 SRestriction 结构中所述的一组搜索条件。
通常, FindRow 从指定的书签向前搜索。 调用方可以通过在 ulFlags 参数中设置 DIR_BACKWARD 标志,将搜索设置为从书签向后移动。 前向搜索从当前书签开始;向后搜索从书签之前的行开始。 搜索的结束位置就在找到满足限制的第一行之前。
如果 BkOrigin 参数中书签指向的行不再存在于表中,并且该表无法为书签建立新位置, FindRow 将返回MAPI_E_INVALID_BOOKMARK。 如果 BkOrigin 指向的行不再存在,并且表能够为书签建立新位置, FindRow 将返回MAPI_W_POSITION_CHANGED。
如果在 BkOrigin 中传递的书签是BOOKMARK_BEGINNING或BOOKMARK_END,则 FindRow 在找不到匹配行时返回MAPI_E_NOT_FOUND。 如果 BkOrigin 中使用的书签是BOOKMARK_CURRENT, 则 FindRow 可以返回MAPI_W_POSITION_CHANGED但不返回MAPI_E_INVALID_BOOKMARK,因为始终存在当前光标位置。
所有表都需要 PR_INSTANCE_KEY (PidTagInstanceKey) 属性列,并且 FindRow 的所有实现都需要支持基于PR_INSTANCE_KEY查找行的调用。
针对实现者的说明
仅当搜索遵循与表组织相同的方向时, FindRow 执行的前缀搜索类型才有用。 为了实现所需的行为,属性限制结构中传递 的RELOP_GE 隐含的比较函数应是表排序顺序所基于的同一比较函数。
给调用方的说明
可以使用 FindRow 支持基于用户键入的字符串进行滚动,尤其是在地址对话框中的列表框中。 在此类型的滚动中,用户输入所需字符串值的渐进式较长前缀,你可以定期发出 FindRow 调用,以跳转到与该前缀匹配的第一行。 光标的跳转方向取决于搜索的运行方向。
若要使用 FindRow,必须设置书签。 字符串搜索可以源自任何书签,包括来自预设书签,这些书签指示表的当前位置以及表的开头和结尾。 如果表中存在大量行,则搜索操作可能会很慢。
使用限制查找用于滚动的字符串前缀,如下所示。 若要对按升序排序的列进行前向搜索,以及针对按降序排序的列进行向后搜索,请使用格式标记GE前缀,在 lpRestriction 参数中传递具有关系RELOP_GE以及相应的属性标记和前缀的属性限制结构。
有关使用限制结构指定筛选器的详细信息,请参阅 关于限制。
MFCMAPI 引用
有关 MFCMAPI 示例代码,请参阅下表。
文件 | 函数 | Comment |
---|---|---|
ContentsTableListCtrl.cpp |
DwThreadFuncLoadTable |
MFCMAPI 使用 IMAPITable::FindRow 方法查找与限制匹配的行。 |