none
データの有無によってGridViewに表示されるコントロールを変更する RRS feed

  • 質問

  • いつもお世話になっております。

    gridviewで一覧表を作成しています。

    「picture」というフィールドには、画像のリンク先URLが記載されています。
    リンク先URLがあれば”あり”と表示させ、ない場合は空欄のままにしたいです。

    下記サイトを見よう見まねで作ってみたのですがエラーになってしまいます。

    http://blogonos.wordpress.com/2006/05/11/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%80%A4%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6gridview%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB/


    コードは以下のとおりです。

            <asp:TemplateField HeaderText="picture" SortExpression="picture">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("picture") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="あり"
                        Visible='<%# Eval("picture") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

    ほか参考サイト等教えていただければと思います。

    お願いいたします!

    2012年5月28日 9:40

回答

  • 「Eval("picture") の戻り値」を「文字列にして」、それが「空の文字列がどうかを判定」する必要があります。
    まずは自力で解決を試みることをお奨めしますが、具体的なコードだけが必要であれば、次の URL をご参照ください。("Visible" で文字列検索すると一発で出ます。)

    ListView Web サーバー コントロールの概要
    http://msdn.microsoft.com/ja-jp/library/bb398790.aspx

    三項演算を埋め込むのも、よくある手ですね。
    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月28日 10:10
  • totojoさんが紹介されているページに答えが書かれていますよ。SurferOnWwwさんも書かれていますが、よく見直してみて下さい。

    Label2のVisibleに、

    Visible='<%#Eval("picture").ToString()%>'>

    と書かれていますが、これではVisibleに、Visible='http://・・・のようなURL' というようにセットされてしまいます。
    URLが存在しない場合はVisibleをFalseをしなければいけませんので、totojoさんが紹介されているページに書かれている通り、

    Visible='<%#Eval("picture").ToString() != String.Empty %>'

    と記述することになります。
    #Eval("picture").ToString() は、pictureが空ですと空文字列になります。
    つまり、
    #Eval("picture").ToString() != String.Empty
    は、
    #Eval("picture").ToString() が空文字でなければtrueを返し、空文字であればfalseを返すことになります。

    よって、
    Visible='<%#Eval("picture").ToString() != String.Empty %>'
    は、
    #Eval("picture").ToString() が空文字であれば結果的に、
    Visible='false'
    となり、表示されなくなります。

    A == B や、 A != B は、trueやfalseを返すということがポイントですが、慣れないとなかなか気づきにくい点かもしれませんね。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月30日 5:22
    モデレータ
  • もしかして、言語が VB だったりしますか?
    だとすると、不等号が...
    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月30日 6:46

すべての返信

  • 「Eval("picture") の戻り値」を「文字列にして」、それが「空の文字列がどうかを判定」する必要があります。
    まずは自力で解決を試みることをお奨めしますが、具体的なコードだけが必要であれば、次の URL をご参照ください。("Visible" で文字列検索すると一発で出ます。)

    ListView Web サーバー コントロールの概要
    http://msdn.microsoft.com/ja-jp/library/bb398790.aspx

    三項演算を埋め込むのも、よくある手ですね。
    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月28日 10:10
  • ご回答いただきありがとうございます!

    午前中いっぱい取り組みましたが
    まだ完成させることができません。。。

    ほかに参考サイト等ありましたら教えていただけますでしょうか。

    お願いいたします!

    2012年5月29日 5:04
  • ちなみに、どのように実装していて、どんな問題が発生しているのでしょうか?
    (何ができていて、何ができていないのでしょうか?)
    2012年5月29日 6:25
  • 環境(OS, .NET Framework, VWD Express, IIS のバージョン、
    DB は何かとそのバージョンなど)を書いてください。

    > リンク先URLがあれば”あり”と表示させ、ない場合は空
    > 欄のままにしたいです。

    「ない場合」はデータベースの picture フィールドは NULL に
    なっていて、その場合は Label2 に "なし" と表示すればいいの
    でしょうか?

    そうであれば、SqlDataSource + GridView のデフォルト設定で
    は、DB のデータが NULL の場合、GridView で得られる文字列は
    "" (String.Empty) となるので、それで判定して Label2 を設
    定すれば可能です。

    totojo さんが紹介されたページで、「"Visible" で文字列検索」
    したのですか?

    2012年5月29日 12:22
  • ご回答ありがとうございます!

    相変わらずまだできていません。
    よく理解できていないままコピペでコードを作成しているので
    お恥ずかしいですが今日までやってきたのは以下のようなことです。

    visual web developerを使用してGridViewを作成しています。

    http://blogonos.wordpress.com/2006/05/11/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%80%A4%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6gridview%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB/
    を参考に、GridViewの"picture"をテンプレートフィールドに変更し、
    "テンプレートの編集"でLabel2を追加し、
    Lavel2プロパティの"テキスト"に"チェック済み"と書きました。

    コードは以下です。
            <asp:TemplateField HeaderText="picture" SortExpression="picture">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("picture") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="チェック済み"
                        Visible='<%# Eval("picture") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

    プレビューしてみると、リンク先URLがある場合もない場合も”チェック済み”が表示されます。

    そこでLabel2の"Databaindingsの編集"で、
    "Visible"を選択し、バインドするフィールドで"picture"を選択したところ
    "InvalidCastExceptionはユーザーコードによってハンドルされませんでした。"
    というエラーが出てページをプレビューできませんでした。

    コードは以下です。
            <asp:TemplateField HeaderText="picture" SortExpression="picture">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("picture") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="チェック済み"
                        Visible='<%# Eval("picture") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

    そこで以下のページ
    http://msdn.microsoft.com/ja-jp/library/bb398790.aspx
    を参考にコードを下記のように書き換えてみましたが同じエラーが出てプレビューできませんでした。

            <asp:TemplateField HeaderText="picture" SortExpression="picture">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("picture") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="チェック済み"
                        Visible='<%#Eval("picture").ToString()%>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

    引き続きよろしくお願いいたします。

    2012年5月30日 4:57
  • 最後のほうだと、Visibleに値を設定しようとしてますが、Visibleにはtrueかfalseのbool型の値しか設定できません。
    そこに文字列を設定しようとしているためInvalidCastException、つまり型の変換ができない、という例外が発生している状態です。

    aspxファイルの中だけで処理するのはちょっと難しいと思いますので、参考にしているページに記述しているカスタムバインドの方法をとって、プログラムのほうでデータの内容を確認し、表示文字列を設定するとかVisibleの値としてtrueかfalseを返すとかといった処理を実装するのがいいと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    2012年5月30日 5:17
  • totojoさんが紹介されているページに答えが書かれていますよ。SurferOnWwwさんも書かれていますが、よく見直してみて下さい。

    Label2のVisibleに、

    Visible='<%#Eval("picture").ToString()%>'>

    と書かれていますが、これではVisibleに、Visible='http://・・・のようなURL' というようにセットされてしまいます。
    URLが存在しない場合はVisibleをFalseをしなければいけませんので、totojoさんが紹介されているページに書かれている通り、

    Visible='<%#Eval("picture").ToString() != String.Empty %>'

    と記述することになります。
    #Eval("picture").ToString() は、pictureが空ですと空文字列になります。
    つまり、
    #Eval("picture").ToString() != String.Empty
    は、
    #Eval("picture").ToString() が空文字でなければtrueを返し、空文字であればfalseを返すことになります。

    よって、
    Visible='<%#Eval("picture").ToString() != String.Empty %>'
    は、
    #Eval("picture").ToString() が空文字であれば結果的に、
    Visible='false'
    となり、表示されなくなります。

    A == B や、 A != B は、trueやfalseを返すということがポイントですが、慣れないとなかなか気づきにくい点かもしれませんね。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月30日 5:22
    モデレータ
  • ご回答いただきありがとうございます!

    ふたつめとみっつめのコードはまったく同じでした。。。大変失礼しました。
    最終的に

                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="チェック済み" 
                        Visible='<%#Eval("picture").ToString() != String.Empty %>'></asp:Label>
                </ItemTemplate>

    と書いてみたのですが”コンパイルエラー”となってしまいます。

    何度もすみませんがご教授お願いいたします。

    2012年5月30日 6:29
  • そのコード自体でコンパイルエラーになることはありません。どこか他でコンパイルエラーになっていると思います。
    どのようなエラーメッセージが出ていますか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年5月30日 6:42
    モデレータ
  • もしかして、言語が VB だったりしますか?
    だとすると、不等号が...
    • 回答としてマーク masunona 2012年5月30日 7:00
    2012年5月30日 6:46
  • みなさんご回答いただきありがとうございます。

    まさに!まさにVBを使っていました・・・!
    とても基本的なところのチェックをすっかりし損じていました。

    以下コードで正常に動作しました。
            <asp:TemplateField HeaderText="picture" SortExpression="picture">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("picture") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("picture") %>'></asp:Label>
                    <asp:Label ID="Label2" runat="server" Text="チェック済み" 
                        Visible='<%#Eval("picture").ToString() <> String.Empty %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

    長々とおつきあいいただきありがとうございました!

    2012年5月30日 6:59
  • >もしかして、言語が VB だったりしますか?

    なるほど! するどいですね。
    思ったのですが、「ListView Web サーバー コントロールの概要」におけるページをはじめ、コードビハインドのサンプルコードは言語別に用意されていることが多いのですが、.aspxにおけるコードは複数言語別に用意されていないんですね。インラインコードが長くて複雑だと複数言語別に用意されるかもしれませんが、今回のようにちょこっとした量だと、見過ごされているのかもしれません。
    初学者の方は特に、サンプル通りに打ち込んでいるのになぜ動かないのか?という方に考えが行ってしまい、自分の使用している言語に合わせて修正しなければならないという方へ考えが向かない状況も理解できる気がします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2012年5月30日 7:08
    モデレータ
  • 思ったのですが、「ListView Web サーバー コントロールの概要」におけるページをはじめ、コードビハインドのサンプルコードは言語別に用意されていることが多いのですが、.aspxにおけるコードは複数言語別に用意されていないんですね。インラインコードが長くて複雑だと複数言語別に用意されるかもしれませんが、今回のようにちょこっとした量だと、見過ごされているのかもしれません。


    もともと質問者さんが参考にされたサイトが C# を対象にしていたので、開発言語は C# であると思い込んでしまってました。
    最初に開発言語を確認しておけば、もう少し早く解決できたかもしれないですね。見込発進はよくないです。

    ロジックをコード ビハインドにきちんと分離していれば .aspx にはバインド式程度の言語ニュートラルなコードしか書かないはずなので、.aspx のコードを言語別に用意するのは省略してしまっているのかもしれないですね。
    (とはいえ、「ListView Web サーバー コントロールの概要」の例だと .aspx に結構ロジックが埋まっているんですけれども。)
    そういう意味では、小野@どっとねっとふぁんさんのアドバイス通りに、Visible にセットする値をコード ビハインド側で加工するのが正攻法な気はします。
    2012年5月30日 8:02