标准列表控制器

标准列表控制器允许您创建可以显示或处理一组记录的 Visualforce 页面。现有 Salesforce 页面的示例 使用一组记录的包括列表页、相关列表、 和大规模行动页面。标准列表控制器可与 以下对象:

  • 帐户
  • 资产
  • 运动
  • 联系
  • 合同
  • 想法
  • 机会
  • 次序
  • 产品2
  • 溶液
  • 用户
  • 自定义对象

以下主题包括有关使用 标准列表控制器:

  • 关联标准列表控制器 使用 Visualforce 页面
  • 使用列表控制器访问数据
  • 使用标准列表控制器操作
  • 将列表视图与标准列表控制器一起使用
  • 使用标准列表覆盖选项卡 控制器
  • 使用标准列表添加自定义列表按钮 控制器

关联标准列表控制器 使用 Visualforce 页面

使用标准列表控制器与使用标准列表控制器非常相似 控制器。首先在组件上设置属性,然后在同一组件上设置属性。standardController<apex:page>recordSetVar例如,要将页面与帐户的标准列表控制器相关联,请使用 以后 标记:

<apex:page standardController="Account" recordSetVar="accounts">

注意

什么时候 您在标签上使用该属性,不能同时使用该属性。standardController<apex:page>controller

该属性不仅指示 页面使用列表控制器,它设置记录集合的变量名称。此变量 可用于访问记录集合中的数据。recordSetVar

使用列表控制器访问数据

使用表达式语法访问记录

将页面与列表控制器关联后,可以使用以下命令对一组记录执行操作 表达式语言语法。例如,若要创建会计科目表,请使用以下命令 标记:

<apex:page standardController="Account" recordSetVar="accounts" tabstyle="account" sidebar="false">
  <apex:pageBlock>
    <apex:pageBlockTable value="{!accounts}" var="acc">
      <apex:column value="{!acc.name}"/>
    </apex:pageBlockTable>
  </apex:pageBlock>
</apex:page>

这 示例使用组件 生成数据表。属性已设置 添加到标准列表控制器加载的变量,该变量是循环访问的记录列表。

<apex:pageBlockTable>value{!accounts}<apex:pageBlockTable>

对于列表中的每条记录,将记录分配给变量。然后,在表中构造一个新行, 使用组件定义的行。该组件使用表示当前记录的变量, 以提取该记录的字段值。<apex:pageBlockTable>acc<apex:pageBlockTable><apex:column><apex:column>acc

列出的组织中的所有帐户名称的生成页面:

使用标准列表控制器时,返回的记录会自动对第一个记录进行排序 由当前视图定义的数据列。使用扩展或自定义列表控制器时,可以控制 sort 方法。

注意

此页面未在请求中指定筛选器,因此页面显示最后一个 使用过滤器。有关将筛选器与列表控制器一起使用的信息,请参阅将列表视图与标准列表控制器一起使用。

与 Lightning 平台 API 中的查询一样,您可以使用表达式语言语法来执行以下操作 从相关记录中检索数据。与标准控制器一样,您最多可以遍历 5 个 子与子关系的级别和父与子关系的一个级别。

带 ID 的访问记录

在典型的页面交互中,用户先从列表视图中选择记录,然后导航到 页面,然后 Visualforce 将它们发送到控制器。您还可以通过以下方式手动指定记录 将所选记录直接设置到控制器上。

标准列表控制器基于类。使用该方法从 Apex 控制器。StandardSetController ApexApexPages.StandardSetController.setSelected()

让我们看一些代码。此示例使用前面示例中的标记来显示 表中的帐户名称。然后,它包含自定义 Apex 代码来请求特定记录 显示。

<apex:page standardController="Account" recordSetVar="accounts" extensions="MyControllerExtension">
  <apex:pageBlock >
    <apex:pageBlockTable value="{!accounts}" var="acc">
      <apex:column value="{!acc.name}"/>
    </apex:pageBlockTable>
  </apex:pageBlock>
</apex:page>

public with sharing class MyControllerExtension {
    private ApexPages.StandardSetController setController;

    public MyControllerExtension(ApexPages.StandardSetController setController) {
        this.setController = setController;
        
        Account [] records = [SELECT Id, Name FROM Account LIMIT 30];
        setController.setSelected(records);
    }
}

标准列表控制器基于 Apex 类。检索分配给 list 控制器,使用 方法 .StandardSetControllerApexPages.StandardSetController.setSelected()

在 的构造函数中,将 SOQL 请求从 Account 对象中选择 ID 和 Name,并限制前 30 个结果。 然后,定义 记录在页面加载时被选中。MyControllerExtensionsetController.setSelected(records)

注意

标准列表控制器最多可以返回 10,000 条记录。自定义控制器可以工作 具有更大的结果集。请参阅使用大型数据集。

还可以通过将记录 ID 列表作为多个包含来将它们传递到 URL 中 查询参数。例如,具有三个帐户 ID 的 URL 如下所示: /apex/pageName?ids=001xx00account1&ids=001xx00account2&ids=001xx00account3

某些浏览器对 URL 的长度有硬性限制。如果您的 URL 包含太多 ID,则 达到该限制的可能性更大,导致您的页面行为不端。而不是 手动将 ID 包含在 URL 字符串中,最好将所选记录设置为 控制器。

使用标准列表控制器操作

操作方法在页面执行逻辑或导航时 事件发生,例如当用户单击按钮或将鼠标悬停在 页。可以通过在以下参数之一的参数中使用表示法从页面标记中调用操作方法 标签:{! }action

  • <apex:commandButton> 创建一个按钮,该按钮调用 行动
  • <apex:commandLink> 创建一个调用操作的链接
  • <apex:actionPoller> 定期调用操作
  • <apex:actionSupport> 创建一个事件(例如 “onclick”、“onmouseover”等) 命名组件,调用操作
  • <apex:actionFunction> 定义了一个新的 JavaScript 调用操作的函数
  • <apex:page> 调用操作 加载页面时

支持的操作方法如下表所示 由所有标准列表控制器。您可以关联这些操作 替换为任何包含属性的 Visualforce 组件。

action

行动描述
save插入新记录或更新现有记录 改变。此操作完成后,该操作会将用户返回到 原始页面(如果已知)或主页。save
quicksave插入新记录或更新现有记录 改变。与操作不同,不会重定向用户 到另一页。savequicksave
list返回标准列表页的 PageReference 对象,基于 在最近使用的该对象的列表筛选器上,当 未由 用户。filterId
cancel中止编辑操作。此操作完成后, 操作返回 用户到用户最初调用编辑的页面。cancel
first显示集中记录的第一页。
last显示集中记录的最后一页。
next显示集中记录的下一页。
previous显示集中记录的上一页。

在以下示例中,用户指定用于查看的筛选器 帐户记录。当用户单击 Go 时, 使用选定的筛选器显示标准列表页。

<apex:page standardController="Account" recordSetVar="accounts">
   <apex:form>
       <apex:selectList value="{!filterid}" size="1">
           <apex:selectOptions value="{!listviewoptions}"/>
       </apex:selectList>
       <apex:commandButton value="Go" action="{!list}"/>
   </apex:form>
</apex:page>

使用列表控制器进行分页

您可以使用列表控制器将分页添加到页面,方法是利用 和 操作。例如,如果 创建具有以下标记的页面:

nextprevious

<apex:page standardController="Account" recordSetvar="accounts">
  <apex:pageBlock title="Viewing Accounts">
  <apex:form id="theForm">
    <apex:pageBlockSection >
      <apex:dataList var="a" value="{!accounts}" type="1">
        {!a.name}
      </apex:dataList>
    </apex:pageBlockSection>
    <apex:panelGrid columns="2">
      <apex:commandLink action="{!previous}">Previous</apex:commandlink>
      <apex:commandLink action="{!next}">Next</apex:commandlink>
    </apex:panelGrid>
  </apex:form> 
  </apex:pageBlock>
</apex:page>

默认情况下,列表控制器返回 20 页面上的记录。控制上显示的记录数 每个页面,使用控制器扩展来设置 .有关控制器的信息 扩展,请参阅构建控制器扩展。

pageSize

注意

使用分页时,当存在 集合中已修改的行。这包括添加的任何新行 通过扩展操作添加到集合中。错误的处理 在这种情况下,消息遵循标准行为,可以 显示在页面上。例如,您可以使用 or 组件来显示 发送给用户的错误消息。<apex:pageMessages><apex:messages>

将列表视图与标准列表控制器一起使用

许多 Salesforce 页面都包含列表视图,允许您筛选记录 显示在页面上。例如,在商机主页上, 您可以选择仅查看您拥有的商机列表 从列表视图中选择 My Opportunity 下拉列表。在与列表控制器关联的页面上,您 还可以使用列表视图。例如,若要创建具有列表视图的简单帐户列表, 使用以下标记创建页面:

<apex:page standardController="Account" recordSetvar="accounts">
  <apex:pageBlock title="Viewing Accounts">
  <apex:form id="theForm">
    <apex:panelGrid columns="2">
      <apex:outputLabel value="View:"/>
      <apex:selectList value="{!filterId}" size="1">
        <apex:actionSupport event="onchange" rerender="list"/>
        <apex:selectOptions value="{!listviewoptions}"/>
      </apex:selectList>
    </apex:panelGrid>
    <apex:pageBlockSection >
      <apex:dataList var="a" value="{!accounts}" id="list">
        {!a.name}
      </apex:dataList>
    </apex:pageBlockSection>
  </apex:form> 
  </apex:pageBlock>
</apex:page>

当您打开该页面时,您会看到如下内容:

此页面与标准帐户控制器相关联,并且 组件 填充为 ,计算结果为用户可以看到的列表视图。当用户 从下拉列表中选择一个值,该值绑定到控制器的属性。 当更改时, 页面可用的记录会发生变化,因此,当 更新时, value 用于更新页面可用的记录列表。<apex:selectlist>{!listviewoptions}filterIdfilterId<apex:datalist>您还可以在编辑页面上使用视图列表,如下所示:

<apex:page standardController="Opportunity" recordSetVar="opportunities" 
              tabStyle="Opportunity"
    sidebar="false">
    <apex:form>
        <apex:pageBlock>
            <apex:pageMessages/>
            <apex:pageBlock>
                <apex:panelGrid columns="2">
                    <apex:outputLabel value="View:"/>
                    <apex:selectList value="{!filterId}" size="1">
                        <apex:actionSupport event="onchange" rerender="opp_table"/>
                        <apex:selectOptions value="{!listviewoptions}"/>
                    </apex:selectList>
                </apex:panelGrid>
            </apex:pageBlock>

            <apex:pageBlockButtons>
                <apex:commandButton value="Save" action="{!save}"/>
            </apex:pageBlockButtons>
            <apex:pageBlockTable value="{!opportunities}" var="opp" id="opp_table">
                <apex:column value="{!opp.name}"/>
                <apex:column headerValue="Stage">
                    <apex:inputField value="{!opp.stageName}"/>
                </apex:column>
                <apex:column headerValue="Close Date">
                    <apex:inputField value="{!opp.closeDate}"/>
                </apex:column>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>

注意

如果用户更改列表视图,则在以下情况下会引发异常 集合中有已修改的行。错误消息的处理 在这种情况下,遵循标准行为,可以显示 在页面上。例如,您可以使用 or 组件来显示 发送给用户的错误消息。<apex:pageMessages><apex:messages>

使用列表控制器编辑记录

您也可以使用列表控制器编辑一组记录。为 例如,如果创建具有以下标记的页面:

<apex:page standardController="Opportunity" recordSetVar="opportunities" tabStyle="Opportunity" sidebar="false">
    <apex:form >
        <apex:pageBlock >
            <apex:pageMessages />
            <apex:pageBlockButtons >
                <apex:commandButton value="Save" action="{!save}"/>
            </apex:pageBlockButtons>
            <apex:pageBlockTable value="{!opportunities}" var="opp">
                <apex:column value="{!opp.name}"/>
                <apex:column headerValue="Stage">
                    <apex:inputField value="{!opp.stageName}"/>
                </apex:column>
                <apex:column headerValue="Close Date">
                    <apex:inputField value="{!opp.closeDate}"/>
                </apex:column>
            </apex:pageBlockTable>      
        </apex:pageBlock>
    </apex:form>
</apex:page>

您会看到一个允许您更新的页面 并保存商机的“阶段”和“结束日期”,如下所示:

有关详细信息,请参阅使用自定义列表控制器批量更新记录。

注意

如果用户不呈现与列表控制器中的 、 或操作关联的命令按钮和链接,则不会呈现 具有适当的权限。同样,如果没有特定记录 与页面、命令按钮和链接相关联 操作不是 呈现。savequicksaveeditedit