3

gwt2.3 celltable を使用しています。

私のセルテーブルには、依存しているいくつかの列のうち複数の列があります。

元。名前と住所の列は依存している 名前と住所の列には、カスタム選択セルが含まれています。

名前列: 1 つのセルに jon、tom、steve が含まれています

Name セルに jon が含まれている場合、住所セルに US & UK を設定したい

ユーザーが名前セルをトムに変更した場合、住所セルにインドと中国を設定したい

ユーザーが名前セルをスティーブに変更した場合、住所セルにjapanaとbhutanを設定したい

名前セルの選択が変更されたときに、住所セルから依存データを変更したい。

どうすればこのことを達成できますか? これを行うためのサンプルコードまたはポインタはありますか?

4

4 に答える 4

2

このソリューションは GWT 2.5 用ですが、おそらく 2.3 でも機能するはずです。最初の列の選択を変更するときに RecordInfo 要素を変更するのが最善だと思います。CustomSelectionCell で次のようにできます。

@Override
public void onBrowserEvent(Context context, Element parent, C value, NativeEvent event, ValueUpdater<C> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    if (BrowserEvents.CHANGE.equals(event.getType())) {
        Xxxxx newValue = getSelectedValueXxxxx();
        valueUpdater.update(newValue);
    }
}

次に、セルを使用する場所に、次のように fieldUpdater を追加します。これにより、RecordInfo が新しい値で更新され、行の再描画が要求されます。

column.setFieldUpdater(new FieldUpdater<.....>() {
    ....
    recordInfo.setXxxxx(newValue);
    cellTable.redrawRow(index);
    ....
});

これにより、他の CustomSelectionCell のレンダリングが呼び出され、そこで RecordInfo の値が変更されたかどうかを確認し、必要に応じて選択値を更新できます。例:

@Override
public void render(Context context, C value, SafeHtmlBuilder sb) {
    if (!value.getXxxxx().equals(this.lastValue)) {
        this.items = loadItemsForValueXxxx(value.getXxxxx());
    }
    .... // Your usual render.
}

項目を変更してデフォルトの選択項目も設定する場合は注意してください。

于 2013-02-04T13:38:01.463 に答える
1

Varun Tulsian の回答は非常に優れていますが、コードは不完全です。

DynamicSelectionCell は、各行のオプションをマップに格納します。セル自体が更新またはレンダリングされると、Context の行インデックスがマップ内の一致する行リストに一致します。

後世については、以下の簡略化および更新されたバージョンを参照してください。

public class DynamicSelectionCell extends AbstractInputCell<String, String> {

interface Template extends SafeHtmlTemplates {
    @Template("<option value=\"{0}\">{0}</option>")
    SafeHtml deselected(String option);

    @Template("<option value=\"{0}\" selected=\"selected\">{0}</option>")
    SafeHtml selected(String option);
}

private static Template template;

/**
 *  key: rowIndex
 *  value: List of options to show for this row
 */
public TreeMap<Integer, List<String>> optionsMap = new TreeMap<Integer, List<String>>();

/**
 * Construct a new {@link SelectionCell} with the specified options.
 *
 */
public DynamicSelectionCell() {
    super("change");
    if (template == null) {
        template = GWT.create(Template.class);
    }
}

public void addOptions(List<String> newOps, int rowIndex) {
    optionsMap.put(rowIndex, newOps);
}

public void removeOptions(int rowIndex) {
    optionsMap.remove(rowIndex);
}

@Override
public void onBrowserEvent(Context context, Element parent, String value,
                           NativeEvent event, ValueUpdater<String> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    String type = event.getType();
    if ("change".equals(type)) {
        Object key = context.getKey();
        SelectElement select = parent.getFirstChild().cast();
        String newValue = optionsMap.get(context.getIndex()).get(select.getSelectedIndex());
        setViewData(key, newValue);
        finishEditing(parent, newValue, key, valueUpdater);
        if (valueUpdater != null) {
            valueUpdater.update(newValue);
        }
    }
}

@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
    // Get the view data.
    Object key = context.getKey();
    String viewData = getViewData(key);
    if (viewData != null && viewData.equals(value)) {
        clearViewData(key);
        viewData = null;
    }

    int selectedIndex = getSelectedIndex(viewData == null ? value : viewData, context.getIndex());
    sb.appendHtmlConstant("<select tabindex=\"-1\">");
    int index = 0;
    try {
        for (String option : optionsMap.get(context.getIndex())) {
            if (index++ == selectedIndex) {
                sb.append(template.selected(option));
            } else {
                sb.append(template.deselected(option));
            }
        }
    } catch (Exception e) {
        System.out.println("error");
    }
    sb.appendHtmlConstant("</select>");
}

private int getSelectedIndex(String value, int rowIndex) {
    if (optionsMap.get(rowIndex) == null) {
        return -1;
    }
    return optionsMap.get(rowIndex).indexOf(value);
}
}
于 2015-09-24T00:27:21.737 に答える
0

または、その特定の列のgetValueで呼び出すことができるメソッドを持つカスタムセルを作成するようなことを行うことができます

いう

final DynamicSelectionCell selection = new DynamicSelectionCell("...");
    Column<GraphFilterCondition, String> operandColumn=new Column<GraphFilterCondition, String>(selection) {
        @Override
        public String getValue(FilterCondition object) {
            if(object.getWhereCol()!=null){
                 ((DynamicSelectionCell)this.getCell()).addOptions(new String[]{">","<",">="});
            }
            if(object.getWhereCondition()!=null){
                return object.getWhereCondition().getGuiName();
            }
            return "";
        }
    };

これはうまくいくはずです。

この他の質問もチェックしてください

于 2013-03-01T21:23:42.673 に答える