如何在WLISTBOX ZK中选择行时设置单元格是否可编辑?

时间:2016-09-22 13:24:27

标签: java zk adempiere

我希望在ZK框架中的WLISTBOX中选择行时使特定单元格可编辑?

2 个答案:

答案 0 :(得分:3)

因为没有答案你想要MVVM或MVC我决定去MVVM。

Here is a working fiddle.
我在这里粘贴了最重要的代码,以便链接不再适用时:

<listbox model="@load(vm.items)" selectedItem="@bind(vm.selected)" hflex="true" height="300px">
    <listhead>
        <listheader label="Name" width="80px"/>
        <listheader label="Price" align="center" width="80px" />
        <listheader label="Quantity" align="center" width="80px" />
    </listhead>
    <template name="model" var="item">
        <listitem >
            <listcell>
                <label visible="@load(vm.selected ne item)" value="@load(item.name)" />
                <textbox visible="@load(vm.selected eq item)" value="@bind(item.name)" />
            </listcell>
            <listcell>
                <label visible="@load(vm.selected ne item)" value="@load(item.price)" />
                <intbox visible="@load(vm.selected eq item)" readonly="true" value="@bind(item.price)" />
            </listcell>
            <listcell>
                <label visible="@load(vm.selected ne item)" value="@load(item.quantity)" />
                <intbox visible="@load(vm.selected eq item)" readonly="true" value="@bind(item.quantity)" />
            </listcell>
        </listitem>
    </template>
</listbox>

很少说明,如果使用之前的ZK 8,你可以使用它。
因此,如果所选项目等于(eq)或者不等于(ne),则我们会检查zul是否为渲染项目。
然后我们改变该组件的可见性。
如果使用ZK8或更高版本,您可以使用<if test="load(vm.selected eq item)"> 有了这个,它就会使用阴影元素,并且不会呈现不是真实的条件(不在DOM中),而使用可见的它将在DOM中。

仅在早期ZK8中使用if 属性${}表达式结合使用,MVVM语法无法正常工作。
而且因为它只是静态的,所以你不能用它来实时切换 这就是我们需要使用visible属性的原因。

答案 1 :(得分:2)

这是一个迟到的回应,但值得记录。

在ZK的ADempiere实现中,WListbox使用WListBoxRenderer渲染行和行中的所有单元格。定义每列的类并将其应用于所有行,使行相同。 WListBoxRenderer使用此类来确定用于显示字段的组件以及用于编辑字段的组件。只有在初始化表时将列定义为读/写时,才会启用编辑器。您可以使用ColumnInfo结构或通过下面显示的setColumnClass()和setColumnReadWrite()方法执行此操作。

/**
 * Set the attributes of the column.
 *
 * @param index     The index of the column to be modified
 * @param classType The class of data that the column will contain
 * @param readOnly  Whether the data in the column is read only
 * @param header    The header text for the column
 *
 * @see #setColumnClass(int, Class, boolean)
 */
public void setColumnClass (int index, Class classType, boolean readOnly, String header)
{
    WListItemRenderer renderer = (WListItemRenderer)getItemRenderer();

    setColumnReadOnly(index, readOnly);

    renderer.setColumnHeader(index, header);

    renderer.setColumnClass(index, classType);

    if (index < m_modelHeaderClass.size())
        m_modelHeaderClass.set(index, classType);
    else
        m_modelHeaderClass.add(classType);

    return;
}

/**
 *  Set Column at the specified <code>index</code> to read-only or read/write.
 *
 *  @param index    index of column to set as read-only (or not)
 *  @param readOnly Read only value. If <code>true</code> column is read only,
 *                  if <code>false</code> column is read-write
 */
public void setColumnReadOnly (int index, boolean readOnly)
{
    Integer indexObject = new Integer(index);

    //  Column is ReadWrite
    if (m_readWriteColumn.contains(indexObject))
    {
        //  Remove from list
        if (readOnly)
        {
            m_readWriteColumn.remove(indexObject);
        }   //  ReadOnly
    }
    //  current column is R/O - ReadWrite - add to list
    else if (!readOnly)
    {
        m_readWriteColumn.add(indexObject);
    }

    return;
}   //  setColumnReadOnly

以下是用于在“付款分配”表单中显示发票的示例。 IMiniTable接口由WListBox类实现。请注意,其中三列设置为readOnly = false,因此表中的这些单元格是可编辑的。

public void setInvoiceColumnClass(IMiniTable invoiceTable, boolean isMultiCurrency)
{
    Vector<String> names = getInvoiceColumnNames(isMultiCurrency);
    int i = 0;
    invoiceTable.setKeyColumnIndex(i);
    invoiceTable.setColumnClass(i, IDColumn.class, true, names.get(i++));        //  0-C_Invoice_ID
    invoiceTable.setColumnClass(i, Timestamp.class, true, names.get(i++));        //  1-TrxDate
    invoiceTable.setColumnClass(i, String.class, true, names.get(i++));           //  2-Value
    if (isMultiCurrency)
    {
        invoiceTable.setColumnClass(i, String.class, true, names.get(i++));       //  3-Currency
        invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++));   //  4-Amt
    }
    invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++));       //  5-ConvAmt
    invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++));       //  6-ConvAmt Open
    invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++));      //  7-Conv Discount
    invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++));      //  8-Conv WriteOff
    invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++));      //  9-Conv Applied
    invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++));     //  10-Conv OverUnder
    //  Table UI
    invoiceTable.autoSize();
}