- PR -

GridViewにおけるCheckBoxFieldとTemplateFieldのCheckBoxの違い

1
投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-14 18:55
いつもお世話になります。

内容に相応しいかどうか迷いましたが、とりあえずこのようなタイトルにしました。
最近いろいろと質問させてもらっているGridView等のデータ系コントロールによる追加・更新に関連したものです。
商品データ等をXMLファイルを利用して管理し、その中で個々の商品を一般ユーザに表示するかどうかをVisible属性の"True"|"False"で指定することでデータの表示・非表示を制御します。

質問は、これを管理する管理者用のGridViewの方でして、ここでVisibleの値を変更できるようにします。実際にCheckBoxField列を挿入してこれをVisibleとBindingした場合には問題なく表示と更新が可能です。

次にこれを拡張しようとしてTemplateFieldに変換して実行すると、「指定されたキャストは有効ではない」というエラーが出ます。これはstring型であるVisibleをCheckプロパティに入れているためでASP.NET1.xでも同じだったと思うのでいいのですが、とした場合にCheckBoxFieldは何故エラーにならないのか?というのが一点目です。表示・更新時に内部的に何か変換でもしているのでしょうか。

次に、エラー回避のため、TemplateFieldの中のCheckBoxの連結式で、Visibleをbool型に変換しようということで、Convert.ToBoolean(Bind("Visible"))としましたが、「'Bind' は現在のコンテキスト内に存在しません。」というエラーでした。うーん、Bindメソッドって何を返してるんでしょうね。Eval("Visible")だと(更新はできませんが)問題なくできるのですが。Bindメソッドで型を変換したい時やフォーマットを変えたい時はどうやるのでしょうか?もしかしてビハインドコードに変換メソッドを書いてそれを呼び出すとか?

よろしければアドバイスお願いできますでしょうか。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-29 12:59
自己レスです。

疑問が解決したというわけではありませんが、CheckBoxFieldをTemplateFieldに変換してもエラーが出ないようにすることはできました。

Bindメソッドについてまだよく理解できていませんが、どうやらConvert.***()のような連結時の操作はできず、DataSourceのDataFieldをそのままBindingしなければならないようだというとこは分かりました。(それでいてなぜCheckBoxFieldではエラーが出ないのかは依然不明)

これに対し幾つか小細工を試みてみましたがやはり無理そうでしたので、データソースであるXMLファイル側を変更してCheckBoxコントロールのVisible属性と型をあわせる(XMLファイルのVisible属性をxs:string型からxs:boolean型に変更)ことで、変換を不要にしてエラーを回避しました。

これを行うために、XMLファイルのスキーマ定義をXML Schemaで行うためxsdファイルを追加し、

・・・
<xs:attribute name="Visible" type="xs:boolean" />
・・・

コード側は、

DataSet ds = new DataSet();
ds.ReadXmlSchema(Server.MapPath("~/App_Data/XMLSchema.xsd"));
ds.ReadXml(Server.MapPath("~/App_Data/XMLFile.xml"), XmlReadMode.InferSchema);

という感じでDataSetにスキーマを指定しました。

ただ、これをすることで、これまで整形式(well-formed)で記述して全てstringで処理していたXMLファイルがvalidになってしまうことから、あらゆるXMLファイルを読み書きする共通の親クラスを設けていたのが少し制約を受けてやりにくくなりそうな気がしています。

結局、当たり前といわれそうなやり方になってしまいましたが、XMLファイルをデータソースに使うのは少数派なのかな?ということで、参考として載せておきます。
1

スキルアップ/キャリアアップ(JOB@IT)