Автоматическая нумерация строк в таблице

Иногда при отображении данных в таблице на Visualforce странице возникает необходимость отображать номер строки и реализовать удаление необходимой строки.

Untitled

Одним из способов добиться этого является использование на 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 мы получаем значение этого параметра, что дает нам возможность удалить из коллекции элемент с соответствующим номером.

3 Likes