ログ日記

作業ログと日記とメモ

DropDownChoiceで全て選択

DropDownChoiceの選択項目として「全て選択」を例外的に追加したい場合がある。


nullで代用する方法もある

「すべてのXXX」などを表示させるシーンではsetNullValid(true)を使用して表示させました。

http://koohzi.sakura.ne.jp/blog/?p=55

が、今回の場合はPageParametersにidを渡したいのでうまくいかなかった。
PageParametersのaddはnullを受け付けない。他と揃えるためにも何らかのInteger型変数を渡したい。
また、選択値が何も指定されていない場合(始めてページを開いたとき)と全て選択を選んだときを区別したい場合もnullで代用できない。


そこで取りあえず -1 を特殊な値として登録してみる。
一見うまくいくが、setRequiredをtrueにしているのに -1 の項目を選択したときだけ「選択してください」のメニューが出る。他の項目を選んだら消える。


原因は AbstractSingleSelectChoice にあった。

public abstract class AbstractSingleSelectChoice<T> extends AbstractChoice<T, T>
{
	private static final long serialVersionUID = 1L;

	/** String to display when the selected value is null and nullValid is false. */
	private static final String CHOOSE_ONE = "Choose One";

	protected static final Object NO_SELECTION_VALUE = "-1";

	private static final String EMPTY_STRING = "";

	/** whether or not null will be offered as a choice once a nonnull value is saved */
	private boolean nullValid = false;
  • 1 が選択無しの値として使われている。他にも空の文字が特殊な値として使われている。


ということで、何か特別な値を使うときには id を -1 以外、表示文字列を空文字以外にする必要がある。