Salesforce-使用jQuery使用复选框删除表行

Salesforce- Using jQuery to delete table rows using checkbox

本文关键字:删除 复选框 使用 jQuery Salesforce-      更新时间:2023-09-26

现在我得到的错误是检查了 sObject People_Language__c的无效字段。

不确定它是否不喜欢使用包装类还是什么,但我没有看到问题。

这是控制器

public with sharing class myClass {
    public String pId                                   {get; set;}
    public list<Wrapper>pLanguages                      {get; set;}


    //CONSTRUCTOR
    public myClass(){
         pId = ApexPages.CurrentPage().getparameters().get('id');
         pLanguages = new List<Wrapper>();
             for ( People_Language__c pl : [SELECT Id, Language__c, Fluency__c FROM People_Language__c WHERE Person__c=:pId] ) {
               pLanguages.add(new Wrapper(pl));
             }
    }

public void deleteLanguage(){
    List<People_Language__c> langsToDelete = new List<People_Language__c>();
    for ( Integer i = 0; i < pLanguages.size(); i++ ) {
        if ( pLanguages[i].checked ) {
            langsToDelete.add(pLanguages.remove(i--).pl);
        }
    }
    delete langsToDelete;
}
    //WRAPPER
    public class Wrapper {
        public boolean checked {get; set;}
        public People_Language__c pl {get; set;}
    public Wrapper(People_Language__c pl) {
        this.pl = pl;
        this.checked = false; 
    }
}
}

视觉力量

<apex:pageBlock title="Language" id="language"> 
    <apex:inputHidden id="delLanguage" value="{!languagesToDelete}"></apex:inputHidden> 
    <apex:pageBlockButtons location="top">       
         <apex:commandButton id="langNewBtn" value="{!$Label.New}" />
         <apex:commandButton id="LangDel" value="{!$Label.del2}" action="{!deleteLanguage}" rerender="language"/>
    </apex:pageBlockButtons>
    <apex:pageBlockTable value="{!pLanguages}" var="lang" title="People Language">
        <apex:column width = "25px">
            <apex:inputCheckbox value="{!lang.checked}" />
        </apex:column>
        <apex:column styleClass="actionColumn" width = "25px"> 
            <apex:facet name="header"> <apex:outputText value="Action" /> </apex:facet>
            <apex:outputLink styleClass="actionLink" target="_top">Del</apex:outputLink>
        </apex:column>
        <apex:column > 
            <apex:facet name="header"> <apex:outputText value="Language" /> </apex:facet>
            <apex:outputField value="{!lang.pl.Language__c}" />
        </apex:column>
        <apex:column > 
            <apex:facet name="header"> <apex:outputText value="Fluency" /> </apex:facet>
            <apex:outputField value="{!lang.pl.Fluency__c}" />
        </apex:column>
    </apex:pageBlockTable> 
</apex:pageBlock>
如果您想

从页面中隐藏行,jQuery可能会很有用,但实际上删除它们需要由Apex控制器处理。执行此操作的最简单方法可能是在控制器中使用包装类,然后deleteLanguage()方法将能够遍历并删除选中复选框的任何记录。jQuery对于这种方法不是必需的。

使用此方法的简单 Apex 控制器:

public with sharing class PeopleLanguagesController {
    public String pId {get; set;}
    public List<Wrapper> pLanguages {get; set;}
    //CONSTRUCTOR
    public PeopleLanguagesController() {
        pId = ApexPages.CurrentPage().getparameters().get('id');
        pLanguages = new List<Wrapper>();
        for ( People_Language__c pl : [SELECT Id, Language__c, Fluency__c FROM People_Language__c WHERE Person__c = :pId] ) {
            pLanguages.add(new Wrapper(pl));
        }
    }
    public PageReference deleteLanguage() {
        List<People_Language__c> langsToDelete = new List<People_Language__c>();
        for ( Integer i = 0; i < pLanguages.size(); i++ ) {
            if ( pLanguages[i].checked ) {
                langsToDelete.add((pLanguages.remove(i--)).pl);
            }
        }
        delete langsToDelete;
        return null;
    }
    //WRAPPER
    public class Wrapper {
        public boolean checked {get; set;}
        public People_Language__c pl {get; set;}
        public Wrapper(People_Language__c pl) {
            this.pl = pl;
            this.checked = false; 
        }
    }
}

然后您的 VF 标记变为:

<apex:page controller="PeopleLanguagesController">
    <apex:form>
    <apex:pageBlock title="Language" id="language">
        <apex:pageBlockButtons location="top">
             <!--<apex:commandButton id="langNewBtn" value="{!$Label.New}" />-->
             <apex:commandButton id="LangDel" value="Delete Languages" action="{!deleteLanguage}" rerender="language"/>
        </apex:pageBlockButtons>
        <apex:pageBlockTable value="{!pLanguages}" var="lang" title="People Language">
            <apex:column width = "25px">
                <apex:inputCheckbox value="{!lang.checked}" />
            </apex:column>
            <apex:column styleClass="actionColumn" width = "25px"> 
                <apex:facet name="header"> <apex:outputText value="Action" /> </apex:facet>
                <apex:outputLink styleClass="actionLink" target="_top">Del</apex:outputLink>
            </apex:column>
            <apex:column > 
                <apex:facet name="header"> <apex:outputText value="Language" /> </apex:facet>
                <apex:outputField value="{!lang.pl.Language__c}" />
            </apex:column>
            <apex:column > 
                <apex:facet name="header"> <apex:outputText value="Fluency" /> </apex:facet>
                <apex:outputField value="{!lang.pl.Fluency__c}" />
            </apex:column>
        </apex:pageBlockTable> 
    </apex:pageBlock>
    </apex:form>
</apex:page>

免责声明:这些代码都没有经过测试,这只是我在记事本++中一起抛出一个例子。希望这能让您走上正轨!

更新

:好的,我把像你这样的数据模型放在一起,更新后的代码编译并且似乎按预期运行。您不应该在 VF 页面上收到 Invalid field checked for sObject People_Language__c 错误,因为此字段是包装器的一部分 - 确保您{!lang.checked}作为 apex:inputCheckbox 标记的值,而不是{!lang.pl.checked}