Как получить выбранный документ на viewPanel xPage для данных внешнего источника?

1

Вот мое простое представление о том, что пользователи JDBCQUERY являются исходными данными. И он показывает каждую строку с помощью флажка, чтобы вы могли выбрать:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:viewPanel rows="30" id="viewPanel1" showColumnHeader="false">
        <xp:this.data>
            <xe:jdbcQuery var="view1" scope="request">
                <xe:this.sqlQuery><![CDATA[#{javascript:"SELECT COLUMN1 FROM MYTABLE"}]]></xe:this.sqlQuery>
                <xe:this.connectionName><![CDATA[#{javascript:"DB2"}]]></xe:this.connectionName>
            </xe:jdbcQuery>
        </xp:this.data>

        <xp:viewColumn columnName="COLUMN1" id="viewColumn1" showCheckbox="true">
            <xp:viewColumnHeader id="viewColumnHeader1" rendered="false"></xp:viewColumnHeader>
        </xp:viewColumn>
    </xp:viewPanel>
</xp:view>

Теперь, чтобы получить выбранные документы, я использую метод /button:

var viewPanel=getComponent("viewPanel1");
var docIDArray=viewPanel.getSelectedIds();
for(i=0;i < docIDArray.length; i++){
    print(docIDArray[i]);
}

Так как это не NotesView/NotesDocument данные, он возвращает только номер строки выбранной строки (не документа UNID)... getSelectedIds() возвращает выбранные строки 1 и 3.

Теперь, как получить значение столбца выбранной строки (value2 и value4)? Это что-то вроде этого: getRow (3).getColumValues()...?

     COLUMN1
[ ]  value1
[x]  value2
[ ]  value3
[x]  value4
[ ]  value5
Теги:
xpages

1 ответ

0
Лучший ответ

Я думаю, что <xp:viewPanel> не подходит для задачи. Я бы изменил его для <xp:dataTable>, хотя в этот момент вам нужно повторно реализовать механизм выбора. Во всяком случае, с помощью видимого бобов, это может быть что-то вроде этого:

<xp:this.data>
    <xe:jdbcQuery var="query" scope="request" connectionName="DB2"
        sqlQuery="SELECT COLUMN1 FROM MYTABLE" loaded="false" />
</xp:this.data>

<xp:dataTable id="dataTable1" binding="#{dataTable}"
    value="#{query}" var="row" indexVar="rowIndex">
    <xp:column id="column1">
        <xp:checkBox id="checkBox1"
            value="#{myBean.jdbcSelectedValues[rowIndex]}" uncheckedValue="false"
            checkedValue="true">
            <xp:this.converter>
                <xp:convertBoolean />
            </xp:this.converter>
        </xp:checkBox>
    </xp:column>
    <xp:column id="column2">
        <xp:text value="#{row}" />
    </xp:column>
</xp:dataTable>

<xp:button id="button1" value="print selected">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="partial" refreshId="dataTable1"
        action="#{myBean.printSelectedColumnValues}">
    </xp:eventHandler>
</xp:button>

объект, охваченный областью видимости

private List<String> jdbcValues;
private Map<Integer, Boolean> jdbcSelectedValues;

public Map<Integer, Boolean> getJdbcSelectedValues() {
    if (jdbcSelectedValues == null) {
        jdbcSelectedValues = new HashMap<Integer, Boolean>();
    }

    return jdbcSelectedValues;
}

public void printSelectedColumnValues() {
    List<String> values = new ArrayList<String>();

    XspDataTableEx dataTable = (XspDataTableEx) FacesUtil.resolveVariable(FacesContext
            .getCurrentInstance(), "dataTable");
    List<?> wrappedData = (List<?>) dataTable.getDataModel().getWrappedData();

    for (Map.Entry<Integer, Boolean> entry : getJdbcSelectedValues().entrySet()) {
        if (entry.getValue()) {
            values.add((String) wrappedData.get(entry.getKey()).getColumnValue("COLUMN1"));
        }
    }

    System.out.println(values);

    jdbcSelectedValues.clear();
}

Идея заключается в том, чтобы захватить дескриптор dataTable с помощью свойства binding (на самом деле это не ортодоксальный способ, я лично не использую эти смешанные подходы, которые игнорируют шаблон MVC) и доступ к обернутым данным, которые он содержит: завернутый данные только в наборе строк.

ПРЕДУПРЕЖДЕНИЕ Единственное, что я не уверен, это то, что именно dataTable.getDataModel().getWrappedData(). Вы можете попытаться напечатать имя класса, прежде чем делать какие-либо действия и последующую работу. Но смысл в том, что с номером индекса и обернутыми данными вы сможете добраться до строк.

  • 0
    xp: dataTable не позволяет вам показывать строки с флажками ... вам нужно поставить элемент управления флажка и поместить выбранный элемент в событие onclick scopeVariable. Я думал, что есть простой способ проверить, какой флажок выбран в viewPanel. В противном случае это не полезно
  • 0
    Конечно, он выполняет работу только для функциональности, для которой требуется только код, который я разместил выше, для репликации, а также множество вещей, которые не относятся к контексту. Честно говоря, я не понимаю, насколько это может быть полезным. Во всяком случае, что я написал, вы все равно можете применить его к представлению - привязка и модель данных - так что ответ прямо перед вами, если вы все еще заинтересованы
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню