如何在xPage的viewPanel上获取外部源数据的选定文档?

时间:2017-06-09 19:38:56

标签: javascript xpages

这是我的简单视图,用户将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>

现在我要使用方法/按钮来获取所选文件:

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

1 个答案:

答案 0 :(得分:0)

我认为<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> 更改它,但是,此时您需要重新实现选择机制。无论如何,在视图范围的bean的帮助下,它可能是这样的:

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();
}

视图范围bean

binding

这个想法是通过dataTable.getDataModel().getWrappedData()属性抓取dataTable的句柄(不是真正的传统方式,我个人不使用这些忽略MVC模式的混合方法)并访问包装它包含的数据:除了行集之外的包装数据。

警告我唯一不确定的是{{1}}究竟是什么。在进行任何演员表和后续工作之前,您可能想尝试打印类名。但感觉是,使用索引号和包装数据,您应该能够到达行。