来自datatable的行未在salesforce中更新

时间:2013-08-26 09:01:36

标签: salesforce apex-code visualforce salesforce-service-cloud

我有一个数据表,其中没有。记录可用。

我正在使用actionPollar,我的操作是updateList,以获取最新列表,以便在给定时间间隔内以我的视图显示,代码如下

<apex:actionPoller action="{!updateList}" reRender="thePageBlock" interval="5"/>

现在,我正在使用以下代码更新任何行。

<apex:commandButton action="{!quicksave}" value="Save" id="saveButton" reRender="thePageBlock"/>

但是,它不会改变。并且不会更新记录。

如果我删除actionPollar的代码并从控制器中删除方法updateList ..更新数据..但是,在放置后,它不起作用。

任何人都可以告诉我该怎么做?

由于

1 个答案:

答案 0 :(得分:1)

有趣,因此它始终保持您的DataSet的相同副本,每5秒刷新一次并显示,这意味着您的ViewState也每5秒刷新一次,在我看来您可能会提交上次收到的相同值不包含任何变化,我会选择两条路线之一:

  1. 在编辑模式下停止轮询器或进行更改也会阻止记录进行编辑,因此没有其他人可以覆盖您的更改。
  2. 将viewState拆分为两个单独的ViewStates,一个将加载记录,第二个将用于编辑所选记录,当保存第一个ViewState将要刷新第二个ViewState上的最后一个更改时,您可以完成这可以通过使用多种形式和同步机制来实现。
  3. 使用选项(1)的建议解决方案,轮询器保持活动状态,它不会干扰记录,在选择时仍然缺少记录的锁定机制

    VisualForce页面

    <apex:page controller="MultipleActionRegionsCtrl">
    
    <!-- SINGLE FORM -->
    
    <apex:form >
    
    <apex:pageBlock title="Master Detail Record Selection/Edition">
    
    <!-- MASTER LIST -->
    <apex:pageBlockSection title="Available Records">
    <apex:actionRegion >
    
    <!-- TABLE-->
    <apex:outputPanel id="recordsPanel">
    <apex:PageBlockTable value="{!cList}" var="c">
    <apex:column value="{!c.FirstName}"/> 
    <apex:column value="{!c.LastName}"/> 
    <apex:actionSupport event="onRowClick" action="{!editSelectedRecord}" rerender="recDetail" status="dataUpdateStatus">
    <apex:param name="cid" value="{!c.Id}" />
    </apex:actionSupport>
    </apex:PageBlockTable>
    </apex:outputPanel>          
    <apex:actionStatus id="dataRefreshStatus">
    <apex:facet name="start">Refreshing...</apex:facet>
    <apex:facet name="stop">Data Loaded</apex:facet>
    </apex:actionStatus>
    
    <!-- RELOAD TABLE-->
    <apex:actionPoller action="{!reloadContacts}" reRender="recordsPanel" interval="5" status="dataRefreshStatus"/>
    
    </apex:actionRegion>
    </apex:pageBlockSection>
    
    <!-- DETAIL -->
    <apex:pageBlockSection title="Record Details" id="recDetail" columns="2">
    <apex:actionRegion rendered="{!IF(editableRecord=null,false,true)}">
    <table>
    <tr>
    <td colSpan="2">
    &nbsp;
    <apex:actionStatus id="dataUpdateStatus" >
    <apex:facet name="start">Loading...</apex:facet>
    <apex:facet name="stop"> </apex:facet>
    </apex:actionStatus>
    </td>
    </tr>
    <tr>
    <td>First Name </td>
    <td><apex:inputField value="{!editableRecord.FirstName}"/></td>
    </tr>
    <tr>
    <td>Last Name </td>
    <td><apex:inputField value="{!editableRecord.LastName}"/></td>
    </tr>                 
    <tr>
    <td><apex:commandButton action="{!saveRecord}" value="Save" reRender="recordsPanel,recDetail"/></td>
    </tr>
    </table>
    </apex:actionRegion>    
    </apex:pageBlockSection>
    
    </apex:pageBlock>     
    
    </apex:form>
    
    </apex:page>
    

    <强>控制器

    public class MultipleActionRegionsCtrl {
    
    public Map<ID, Contact> cMap {get;set;}
    public Contact editableRecord {get;set;}
    
    // Using lazy load for test purposes
    public List<Contact> cList {
    get{
    if(cMap == null){
    cMap = new Map<ID, Contact>([SELECT Id, FirstName, LastName From Contact limit 10]);
    }
    return cMap.values();
    }
    }
    
    public MultipleActionRegionsCtrl(){ }
    
    public PageReference reloadContacts(){
    if(cMap!=null && !cMap.isEmpty()){
    Set<Id> myIds = cMap.keySet();
    // reload same records loaded at the start
    cMap = new Map<ID, Contact>([SELECT Id, FirstName, LastName From Contact WHERE Id IN :myIds]); 
    }
    return null;
    }
    
    public PageReference editSelectedRecord() {
    String cID = ApexPages.currentPage().getParameters().get('cid');
    if(cMap!=null && !cMap.isEmpty() && cMap.containsKey(cID)){
    editableRecord = cMap.get(cID);
    }
    return null;
    }
    
    public PageReference saveRecord(){
    update editableRecord;
    editableRecord = null; // so we don't save two times same record
    return reloadContacts(); //instantly update current list do not wait for poller
    }
    
    }