- PR -

FormView(ItemTemplate上のLabel)の編集について

1
投稿者投稿内容
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-14 20:35
FormViewについて質問させて頂きます。


<前提>
言語:ASP.NET 2.0 (VB.NET)
環境:VisualStudio2005
DB:Oracle 10g

<要件・ご質問>
FormViewを使用し、ItemTemplateに追加されたLabelにバインドされている値を編集したいのですが、その方法が分かりません。
(例.先頭が"9"の文字列を"非表示"と編集)
ご教示頂ければ幸いです。

<現状>
aspx.vbファイルにて、当該FormViewのDataBound時(FormView_DataBoundメソッド内で)、FormView.DataItemプロパティに編集後の文字列をセットしたが、デバッグの結果、編集されないままの文字列が画面表示される。
また、FormView.Rowプロパティを使用しようとしたが、その方法が分からない。「Row.Cells(0).Controls.Add(-編集後文字列-)」とすると、編集後文字列は画面表示されるが、新規にLabelが追加されてしまい、希望通りの画面配置が実現できない。


拙い文章で大変恐縮ではございますが、宜しくお願い申し上げます。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-14 22:04
聞いてばかりというのも何ですので、たまには回答してみることにします。
ただ、FormViewは私も勉強を始めようとしている段階ですので、もっと適当な方法があるとかもしれません。
私の場合、「先頭が"9"の文字列を"非表示"と編集する」"だけ"であれば、のすけさんがやられている方法ではなくて、もっと手っ取り早くやってしまいます。具体的には、操作したいLabelのText属性で次のようにします。

Text='<%# Eval("***").ToString().StartsWith("9") ? "非表示" : Eval("***") %>'

これはC#の条件分岐式(If文相当)なのでVBだとどうなるのかよく知りませんが、作りかけのFormViewで試したところでは出来ています。
なお、これは、Labelに表示するだけですので、更新が絡む(Bindメソッドの場合)とよくわかりません。(ちょうど別スレッドで質問中です^_^;)

これだと簡単な変換しかできませんが、複雑になると、コードビハインド側に変換用メソッドを作っておいて、連結式からそれを呼び出すとかの方法もありますね。

Row.Cells・・・は、FormViewではやったことがないので別の人にお願いしましょう。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-14 23:29
BTさんが書いているような方法が楽でしょうね。

> 「Row.Cells(0).Controls.Add(-編集後文字列-)」とすると、

コントロールを追加(Add)しているのですからLabelが追加されて当然ですね。
元々のLabelを消して、、、なんてはじめるとあとでなにか変更しようとしたときに
大変になったりしますから、もっと楽にできる方法があるならそちらを利用した
ほうがよいでしょう。
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-15 09:51
BTさん、どっとねっとふぁんさん、ご返答ありがとうございます。

<実験結果>

早速、BTさんのサンプルで試してみましたが、うまくいきません。
(もちろん、"***"は適切な項目名を入れています。)

(エラー内容)
文字が有効ではありません。
ステートメントの終わりを指定してください。
…すなわち、当該タグのところでエラーとなっているようです。

どなたか、Evalメソッド内でのVBの条件分岐式(If文相当)をご教示頂きたく存じます。

<追加要件>
「先頭が"9"の文字列を"非表示"と編集する」"だけ"ではなく、
「先頭が"9"で、桁数が5桁の文字列を"非表示"と編集する」というのが最終的に実現したい要件です。
こちらも併せてご検討頂けると幸いです。

>BTさん
何か、参考となる書籍やHPなど教えて頂ければ幸いです。

以上、宜しくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-15 10:27
BTさんが書いている「コードビハインド側に変換用メソッドを作っておいて、
連結式からそれを呼び出すとかの方法」の例を以下の記事の最後に載せています。
http://dotnetfan.org/blogs/dotnetfanblog/articles/692.aspx

参考になるかな?
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-15 11:02
どっとねっとふぁんさん、ご返答ありがとうございます。

教えて頂いたURLの記事の内容で解決致しました。
カスタムバインドのコード式はアヤしいとは思っていましたが、ここでメソッドを呼び出すという発想に至りませんでした。
(言われてみれば納得なのですが、初心者ゆえ…。)

本当に助かりました。ありがとうございました。
今後とも宜しくお願い致します。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-11-15 12:06
解決されたようでなによりです。

最初の式はC#ですのでVBで書き直さないといけません。
ただ、自分で書いておきながらなんですが、ちょっと試した感じではVB.NETでは出来ないかもしれませんね(VB.NETはよく知らないので不確実ですけど)。ASPのVBSでは何重でもIF文をネストできたのですけど。←VB使いの方、訂正ありましたらよろしくお願いします。
まあ今回はともかく、簡単な操作であれば、連結式のところで変換するのが一番いいと思います。

ちなみに、コードビハインド側のメソッドのアクセス修飾子は"protected"でもOKですので自分はそうしてます。

あと試しにコードビハインドのメソッドにBind("***")を渡してみましたがやっぱりダメですね。うーむBindは根本的に何か違うのかも。
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-15 13:04
BTさん

アクセス修飾子の補足情報、ありがとうございます。
実は、実験しようと考えていたところでした。
やはりprotectedでもOKでしたね。
私もprotectedで実装しようと思います。
1

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