Javascript Salesforce-使用jQuery通过复选框删除表行
现在我得到的错误是对sObject People\u Language\uu\c检查的字段无效 我不确定它是否不喜欢使用包装器类或其他什么,但我看不出问题所在 这是控制器Javascript Salesforce-使用jQuery通过复选框删除表行,javascript,jquery,salesforce,apex-code,visualforce,Javascript,Jquery,Salesforce,Apex Code,Visualforce,现在我得到的错误是对sObject People\u Language\uu\c检查的字段无效 我不确定它是否不喜欢使用包装器类或其他什么,但我看不出问题所在 这是控制器 public with sharing class myClass { public String pId {get; set;} public list<Wrapper>pLanguages
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;
}
}
}
public与共享类myClass{
公共字符串pId{get;set;}
公共listpLanguages{get;set;}
//建造师
公共myClass(){
pId=ApexPages.CurrentPage().getparameters().get('id');
pLanguages=新列表();
for(People\u Language\u c pl:[从People\u Language\u c中选择Id、Language\u c、Fluence\u c,其中Person\u c=:pId]){
添加(新包装器(pl));
}
}
公共语言(){
List langsToDelete=新列表();
对于(整数i=0;i
视觉力
<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;
}
}
}
public与共享类PeopleLanguagesController{
公共字符串pId{get;set;}
公共列表语言{get;set;}
//建造师
公共人物语言控制器(){
pId=ApexPages.CurrentPage().getparameters().get('id');
pLanguages=新列表();
for(People\u Language\u c pl:[从People\u Language\u c中选择Id、Language\u c、Fluence\u c,其中Person\u c=:pId]){
添加(新包装器(pl));
}
}
公共页面引用deleteLanguage(){
List langsToDelete=新列表();
对于(整数i=0;i
然后您的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>
德尔
免责声明:这些代码都没有经过测试,这只是我用Notepad++编写的一个示例。希望这能让你走上正轨
更新:好的,我创建了一个像您这样的数据模型,更新后的代码可以编译,并且似乎可以按预期运行。您不应该在VF页面上为sObject People_Language__c错误检查
无效字段,因为此字段是包装的一部分-确保将{!lang.checked}
作为apex:inputCheckbox
标记的值,而不是{!lang.pl.checked}
如果您想在页面中隐藏行,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;
}
}
}
public与共享类PeopleLanguagesController{
公共字符串pId{get;set;}
公共列表语言{get;set;}
//建造师
公共人物语言控制器(){
pId=ApexPages.CurrentPage().getparameters().get('id');
pLanguages=新列表();
for(People\u Language\u c pl:[从People\u Language\u c中选择Id、Language\u c、Fluence\u c,其中Person\u c=:pId]){
添加(新包装器(pl));
}
}
公共页面引用deleteLanguage(){
List langsToDelete=新列表();
对于(整数i=0;i
然后您的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>
德尔