Иногда при отображении данных в таблице на Visualforce странице возникает необходимость отображать номер строки и реализовать удаление необходимой строки.
Одним из способов добиться этого является использование на Visualforce странице тэгов apex:variable и apex:param.
Реализация данного функционала будет состоять из 2 основных частей:
- написание back-end части в виде контроллера
- и front-end части в виде Visualforce страницы
Также, для примера мы создадим класс numberLineClass
, который будет содержать два поля firstName
и lastName
.
Class numberLineClass
public class numberLineClass {
public String firstName{get; set;}
public String lastName{get; set;}
public numberLineClass(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Controller
public class numberLineController {
public List<numberLineClass> numberLineList{get; set;}
public numberLineController() {
numberLineList = new List<numberLineClass>();
for(Integer i = 0; i < 10; i++) {
numberLineList.add(new numberLineClass('FirstName '+i, 'LastName '+i));
}
}
public PageReference deleteLine() {
Map<String, String> pageParameters = Apexpages.currentpage().getParameters();
Integer numberOfDeletedLine = Integer.valueOf(pageParameters.get('numberOfLine'));
if (!numberLineList.isEmpty()) {
numberLineList.remove(numberOfDeletedLine);
}
return null;
}
}
public List<numberLineClass> numberLineList{get; set;}
- это коллекция, которая хранит данные для отображения в таблице на Visualforce странице и заполняется в конструкторе.
public PageReference deleteLine()
- этот метод реализует функционал удаления необходимого элемента из коллекции. Он вызывается при клике на ссылку delete
на Visualforce странице. В методе мы получаем коллекцию параметров со страницы
Map<String, String> pageParameters = Apexpages.currentpage().getParameters();
Затем мы получаем значение нужного нам параметра
Integer numberOfDeletedLine = Integer.valueOf(pageParameters.get('numberOfLine'));
Значение параметра будет соответствовать номеру элемента, удаляемого из коллекции.
И удаляем нужный элемент из коллекции
numberLineList.remove(numberOfDeletedLine);
Visualforce Page
<apex:page controller="numberLineController">
<apex:form>
<apex:pageBlock>
<apex:variable var="rowNumber" value="{!0}"/>
<apex:pageBlockSection>
<apex:pageBlockTable value="{!numberLineList}" var="numberLine" columns="4">
<apex:column headerValue="Line Number">
<apex:outputText value="{!rowNumber}"/>
</apex:column>
<apex:column headerValue="First Name">
<apex:outputText value="{!numberLine.firstName}"/>
</apex:column>
<apex:column headerValue="Last Name">
<apex:outputText value="{!numberLine.lastName}"/>
</apex:column>
<apex:column headerValue="Action">
<apex:commandLink action="{!deleteLine}" value="Delete">
<apex:param name="numberOfLine" value="{!rowNumber}"/>
<apex:variable var="rowNumber" value="{!rowNumber+1}"/>
</apex:commandLink>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Ключевым моментом здесь является объявление apex:variable
на уровне apex:pageBlock
.
<apex:pageBlock>
<apex:variable var="rowNumber" value="{!0}"/>
<apex:pageBlockSection>
В последнем столбце таблицы, который содержит ссылку для удаления строки, мы используем тэги:
<apex:param name="numberOfLine" value="{!rowNumber}"/>
<apex:variable var="rowNumber" value="{!rowNumber+1}"/>
Таким образом, при отображении страницы каждая новая строка, отображающая соответствующий элемент коллекции numberLineList
, получает уникальный номер, соответствующий номеру элемента коллекции. Этот номер присваивается параметру с именем numberOfLine
. Как было описано выше, при клике по ссылке Delete
мы получаем значение этого параметра, что дает нам возможность удалить из коллекции элемент с соответствующим номером.