データの値によってGridViewに表示されるコントロールを変更する
bit値を持つデータ項目の値がtrueだった場合、GridViewにテキストを表示したい、という質問がありました。これに対して、私が実装した方法をまとめます。
用意したデータは本当にシンプルに以下のような形をしています(w
このテーブルをWebページにドラッグ アンド ドロップするとGridViewとSqlDataSourceが作成されます。このGridViewで編集を有効にします。
GridViewのスマートタグから列の編集を選択し、bitDataフィールドをTemplateFieldに変換します。
GridViewのスマートタグからテンプレートの編集を選択し、ItemTemplateにLabelを貼り付けます。
LabelのスマートタグからDataBindingsの編集を選択します。ここでVisibleプロパティにbitDataフィールドをバインドします。
ここまでできたら一度デバッグ実行をしてみましょう。チェックされているデータの横にLabelが表示されます。
データの編集時にはLabelは表示されません。また、ここでデータをチェックをはずすとLabelが表示されなくなります。
bitDataの値をVisibleプロパティにバインドすることでコントロールの表示/非表示を制御できることがわかりました。ではLabelが表示されているとき、CheckBoxが表示されないようにするにはどうしたらよいでしょうか。
テンプレートの編集画面でCheckBoxのスマートタグからDataBindingsの編集を選択します。ここでVisibleプロパティにbitDataフィールドをバインドします。これではLabelと同じ表示/非表示の動きをしてしまうので、カスタムバインドを選択し、コード式を以下のようにします。
!(bool)Eval("bitData")
ここでは Eval("bitData") がobject型でデータを返すので、それをbool型にキャストし、反転させています。
デバッグを実行すると、Labelが表示されている場合にはCheckBoxは非表示になっていることが確かめられます。
この場合のようにbit値の反転といったちょっとしたプログラムならコード式に含めてもいいでしょうが、もうちょっとデータに対して複雑な条件判定を行いたいような場合はどうしたらよいでしょうか。
実はカスタムバインド時にはPublicなメソッドを呼び出すことも可能です。Webページのコードに以下の記述を行います。
public bool ReverseBit(object bflg)
{
return !(bool)bflg;
}
そしてCheckBoxのデータバインディングを以下のように変更してみましょう。
この場合も同じように動作することが確認できます。
このテクニックはデータの形式を変更してGridViewに表示するといった場合にも使えるので覚えておくといいですね。