3

私のアプリケーション (RichFaces 4.1) には、extendedDataTable があり、バッキング Bean では、選択した行を追跡する必要があります。次のコードでこれを実現します。

JSF:

<rich:extendedDataTable id="freie"
    selectionMode="multipleKeyboardFree"
    selection="#{myBean.tableSelection}"
    ...
<a4j:ajax execute="@this" event="selectionchange" 
          listener="#{myBean.tableSelection}"
          render="indicatorPanel" />

ジャワ:

    UIExtendedDataTable dataTable= (UIExtendedDataTable) event.getComponent();
    Object originalKey= dataTable.getRowKey();
    _tableSelectedEntries.clear();
    for (Object selectionKey: _tableSelection) {
        dataTable.setRowKey(selectionKey);
        if (dataTable.isRowAvailable()) {
            _tableSelectedEntries.add((Entry) dataTable.getRowData());
        }
    }
    dataTable.setRowKey(originalKey);

テーブルがフィルタリングされていない限り、これは正常に機能します。標準の RichFaces の方法を使用して、テーブルをフィルター処理します。

<rich:column sortBy="#{mitarbeiter.vorname}"
 filterValue="#{mitarbeiterFilterBean.firstNameFilter}"
 filterExpression="#{fn:containsIgnoreCase(mitarbeiter.vorname, mitarbeiterFilterBean.firstNameFilter)}">

テーブルがフィルタリングされ、たとえば最初の行を選択すると、バッキング Bean のフィルタリングされていないテーブルの最初の行の rowKey が取得されます。テーブルがフィルタリングされているときに、選択した行のrowDataを取得するにはどうすればよいですか?

私のコードは、ショーケースと同じように機能すると思います。

4

2 に答える 2

2

フィルター Bean を SessionScoped にすることで問題を解決できました。また、現在選択されている行をバッキング Bean にバインドしなくなりました。次を使用して、選択した行を取得します。

public void tableSelection (AjaxBehaviorEvent event) {
    UIExtendedDataTable dataTable= (UIExtendedDataTable) event.getComponent();
    for (Object selectionKey: dataTable.getSelection()) {

また、 rowKeyVarを使用して正しい行インデックスを取得することもできます。

于 2012-10-05T07:13:50.633 に答える
1

私が試してみてうまくいったので、何かを見落としているかもしれません。

のソースをコピーしselectableTable、フィルター メソッドを追加しましたfilterTable

使用例: 選択したアイテム/アイテム データを取得するには、選択したアイテム リストの get メソッドを使用します。


ソースコード (xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Richfaces Welcome Page</title>
    </h:head>
    <h:body>

        <h:panelGrid columns="2">
            <h:form>
                <fieldset style="margin-bottom: 10px;">
                    <legend>
                        <h:outputText value="Selection Mode " />
                    </legend>
                    <h:selectOneRadio value="#{exTableSelect.selectionMode}">
                        <f:selectItem itemLabel="Single" itemValue="single" />
                        <f:selectItem itemLabel="Multiple" itemValue="multiple" />
                        <f:selectItem itemLabel="Multiple Keyboard-free" itemValue="multipleKeyboardFree" />
                        <a4j:ajax render="table, res" />
                    </h:selectOneRadio>
                </fieldset>
                <rich:extendedDataTable value="#{exTableSelect.inventoryItems}" var="car"
                                        selection="#{exTableSelect.selection}" id="table" style="height:300px; width:500px;"
                                        selectionMode="#{exTableSelect.selectionMode}">
                    <a4j:ajax execute="@form" event="selectionchange" listener="#{exTableSelect.selectionListener}"
                              render=":res" />
                    <f:facet name="header">
                        <h:outputText value="Cars marketplace" />
                    </f:facet>
                    <rich:column filterValue="#{exTableSelect.vendorFilter}"
                                 filterExpression="#{fn:containsIgnoreCase(car.vendor, exTableSelect.vendorFilter)}">
                        <f:facet name="header">
                            <h:panelGroup>
                                <h:outputText value="Vendor " />
                                <h:inputText value="#{exTableSelect.vendorFilter}">

                                    <a4j:ajax render="table" execute="@this" event="change" />
                                </h:inputText>
                            </h:panelGroup>
                        </f:facet>
                        <h:outputText value="#{car.vendor}" />
                    </rich:column>
                </rich:extendedDataTable>
            </h:form>
            <a4j:outputPanel id="res">
                <rich:panel header="Selected Rows:" rendered="#{not empty exTableSelect.selectionItems}">
                    <rich:list type="unordered" value="#{exTableSelect.selectionItems}" var="sel">
                        <h:outputText value="#{sel.vendor} - #{sel.model} - #{sel.price}" />
                    </rich:list>
                </rich:panel>
            </a4j:outputPanel>
        </h:panelGrid>
    </h:body>
</html>

マネージド Bean:

public class ExTableSelect {

    private String selectionMode = "multiple";
    private Collection<Object> selection;

    private List<InventoryItem> inventoryItems;
    private List<InventoryItem> selectionItems = new ArrayList<InventoryItem>();

    private String vendorFilter;

    public void selectionListener(AjaxBehaviorEvent event) {
        UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
        Object originalKey = dataTable.getRowKey();
        selectionItems.clear();
        for (Object selectionKey : selection) {
            dataTable.setRowKey(selectionKey);
            if (dataTable.isRowAvailable()) {
                selectionItems.add((InventoryItem) dataTable.getRowData());
            }
        }
        dataTable.setRowKey(originalKey);
    }

     public Filter<?> getFilterVendor() {
        return new Filter<InventoryItem>() {
            public boolean accept(InventoryItem t) {
                String vendor = getVendorFilter();
                if (vendor == null || vendor.length() == 0 || vendor.equals(t.getVendor())) {
                    return true;
                }
                return false;
            }
        };
    }

    @PostConstruct
    public void addInventory(){

        InventoryItem i = new InventoryItem();
        i.setVendor("A");
        InventoryItem i2 = new InventoryItem();
        i2.setVendor("AB");
        InventoryItem i3 = new InventoryItem();
        i3.setVendor("AC");
        InventoryItem i4= new InventoryItem();
        i4.setVendor("E");
        InventoryItem i5 = new InventoryItem();
        i5.setVendor("F");
        InventoryItem i6 = new InventoryItem();
        i6.setVendor("G");
        InventoryItem i7 = new InventoryItem();
        i7.setVendor("H");
        InventoryItem i8 = new InventoryItem();
        i8.setVendor("I");
        InventoryItem i9 = new InventoryItem();
        i9.setVendor("J");

        inventoryItems= new ArrayList<InventoryItem>();

        inventoryItems.add(i);
        inventoryItems.add(i2);
        inventoryItems.add(i3);
        inventoryItems.add(i4);
        inventoryItems.add(i5);
        inventoryItems.add(i6);
        inventoryItems.add(i7);
        inventoryItems.add(i8);
        inventoryItems.add(i9);
    }

    public Collection<Object> getSelection() {
        return selection;
    }

    public void setSelection(Collection<Object> selection) {
        this.selection = selection;
    }

    public List<InventoryItem> getInventoryItems() {
        return inventoryItems;
    }

    public void setInventoryItems(List<InventoryItem> inventoryItems) {
        this.inventoryItems = inventoryItems;
    }

    public InventoryItem getSelectionItem() {
        if (selectionItems == null || selectionItems.isEmpty()) {
            return null;
        }
        return selectionItems.get(0);
    }

    public List<InventoryItem> getSelectionItems() {
        return selectionItems;
    }

    public void setSelectionItems(List<InventoryItem> selectionItems) {
        this.selectionItems = selectionItems;
    }

    public String getSelectionMode() {
        return selectionMode;
    }

    public void setSelectionMode(String selectionMode) {
        this.selectionMode = selectionMode;
    }

    public void setVendorFilter(String vendorFilter) {
        this.vendorFilter = vendorFilter;
    }

    public String getVendorFilter() {
        return vendorFilter;
    }
}
于 2012-10-03T12:08:35.597 に答える