none
ASP.NET2.0で、GridViewのデータ表示について RRS feed

  • 質問

  • ASP.NET2.0で、GridViewのデータ表示について

     

    100000と入力されたデータを金額イメージで画面に¥100,000と表示させたいのですが、良い方法を教えてください。

     

    例)

    テーブルに文字形式で、100000とデータがあります。

    GridViewを使用してデータ表示を画面に表示すると、100000と表示されます。

    変換処理等により、¥100,000と画面に表示する方法を、教えてください。

     

    よろしくお願いします。

     

    以上

    2008年7月30日 9:46

回答

  • > VBのサンプルソースを提供してもらえないでしょうか?

     

    これも夏休みで暇なので特別に・・・

     

    Code Snippet

    <%@ Page Language="VB" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
       
        Protected Function Memo(ByVal str As String) As String
            Dim i As Int32 = Int32.Parse(str)
            Return i.ToString("¥#,###")
        End Function
       
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>"
                SelectCommand="SELECT [id], [name], [price], [memo], [total] FROM [table]">
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="id" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                        ReadOnly="True" SortExpression="id" />
                    <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
                    <asp:BoundField DataField="price" DataFormatString="{0:¥#,###}"
                        HeaderText="price" HtmlEncode="False" SortExpression="price" />
                    <asp:BoundField DataField="memo" HeaderText="memo" SortExpression="memo" />
                    <asp:TemplateField HeaderText="memo (ToString(¥#,###))">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Memo(Eval("memo")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="total" DataFormatString="{0:¥#,###}"
                        HeaderText="total" HtmlEncode="False" SortExpression="total" />
                    <asp:TemplateField HeaderText="total Eval(&quot;total&quot;, &quot;{0:¥#,###}&quot;)" >
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text='<%# Eval("total", "{0:¥#,###}") %>' ></asp:Label>
                        </ItemTemplate>          
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>      
        </div>
        </form>
    </body>
    </html>

     

     

    > また、質問ですが、デ-タが、0の場合、画面表示を空白表示にしたいのですが、

     

    Text='<%# Memo(Eval("memo")) %>'  の例を参照ください。この Memo メソッド

    で Eval(#memo") が 0 のときは空白を返すようにすればよいと思います

     

    2008年8月6日 11:48
  • 先の例と同じく、

     

    id     int
    name   varchar(50)
    price  money
    memo   varchar(50)
    total  int

     

    という定義のテーブルで、price, memo, total が NULL または 0 のときは空白、
    数字が入っているときは ¥xxx,xxx,xxx のように表示できます。

     

    Code Snippet

    <%@ Page Language="VB" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
       
        Protected Function ChangeFormat(ByVal obj As Object) As String
            If TypeOf obj Is DBNull Then
                Return String.Empty
            ElseIf TypeOf obj Is Decimal Then
                Dim i As Decimal = CType(obj, Decimal)
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            ElseIf TypeOf obj Is Integer Then
                Dim i As Integer = CType(obj, Integer)
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            ElseIf TypeOf obj Is String Then
                Dim i As Int32 = Int32.Parse(CType(obj, String))
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            Else
                Return "Invalid Arg."
            End If
        End Function
       
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>"
                SelectCommand="SELECT [id], [name], [price], [memo], [total] FROM [table]">
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="id" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                        ReadOnly="True" SortExpression="id" />
                    <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
                    <asp:TemplateField HeaderText="price (money)" >
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# ChangeFormat(Eval("price")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="memo (varchar)">
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text='<%# ChangeFormat(Eval("memo")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="total (int)" >
                        <ItemTemplate>
                            <asp:Label ID="Label3" runat="server" Text='<%# ChangeFormat(Eval("total")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>      
        </div>
        </form>
    </body>
    </html>

     

     

    2008年8月8日 3:19

すべての返信

  • 数値の10000をカンマ編集する方法は、わかりました。

     

    DataFormatString="{0:N0}"を使用することで、カンマ編集されるようです。

     

     

    サンプル例)

     

     <asp:BoundField DataField="kaku2" DataFormatString="{0:N0}" HtmlEncode="False" HeaderText="価格" SortExpression="kaku2" />

     

    kaku2 numeric(9, 0)のテーブルです。

     

    実行した結果、10,000と表されました。

     

    テーブルのchar(10)のデータをカンマ編集する方法を教えてください。

     

    よろしくお願いします。

     

     

    2008年8月1日 8:28
  • 逆の発想で、テーブルからデータを取り出すときにCONVERT関数などで、数値型に変換してはいかがでしょうか?

    http://msdn.microsoft.com/ja-jp/library/ms175509.aspx

    2008年8月1日 12:44
  • id     int
    name   varchar(50)
    price  mony
    memo   varchar(50)
    total  int

     

    というテーブルで、以下のコードで ¥xxx,xxx,xxx のように表示できます。

     

    Code Snippet

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        protected string Memo(string memo)
        {
            long i = int.Parse(memo);
            return i.ToString("¥#,###");
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>   
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>"
                SelectCommand="SELECT [id], [name], [price], [memo], [total] FROM [table]">
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="id" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                        ReadOnly="True" SortExpression="id" />
                    <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
                    <asp:BoundField DataField="price" DataFormatString="{0:¥#,###}"
                        HeaderText="price" HtmlEncode="False" SortExpression="price" />
                    <asp:BoundField DataField="memo" HeaderText="memo" SortExpression="memo" />
                    <asp:TemplateField HeaderText="memo (ToString(¥#,###))">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Memo((string)Eval("memo")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="total" DataFormatString="{0:¥#,###}"
                        HeaderText="total" HtmlEncode="False" SortExpression="total" />
                    <asp:TemplateField HeaderText="total Eval(&quot;total&quot;, &quot;{0:¥#,###}&quot;)" >
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text='<%# Eval("total", "{0:¥#,###}") %>' ></asp:Label>
                        </ItemTemplate>          
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>   
        </div>
        </form>
    </body>
    </html>

     

     

     

    2008年8月4日 12:37
  •   SurferOnWww

     

    回答ありがとうございます。

     

    VBで開発しているので、回答されたC言語のソースを使用できない状態です。

     

    VBのサンプルソースを提供してもらえないでしょうか?

     

    どうぞ、よろしくお願いします。

     

     

    また、質問ですが、デ-タが、0の場合、画面表示を空白表示にしたいのですが、

     

    判定方法、または、フォーマット定義等で、対応できる方法があれば、教えてください。

     

    よろしくお願いします。

     

    以上

    2008年8月6日 8:57
  • > VBのサンプルソースを提供してもらえないでしょうか?

     

    これも夏休みで暇なので特別に・・・

     

    Code Snippet

    <%@ Page Language="VB" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
       
        Protected Function Memo(ByVal str As String) As String
            Dim i As Int32 = Int32.Parse(str)
            Return i.ToString("¥#,###")
        End Function
       
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>"
                SelectCommand="SELECT [id], [name], [price], [memo], [total] FROM [table]">
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="id" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                        ReadOnly="True" SortExpression="id" />
                    <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
                    <asp:BoundField DataField="price" DataFormatString="{0:¥#,###}"
                        HeaderText="price" HtmlEncode="False" SortExpression="price" />
                    <asp:BoundField DataField="memo" HeaderText="memo" SortExpression="memo" />
                    <asp:TemplateField HeaderText="memo (ToString(¥#,###))">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# Memo(Eval("memo")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="total" DataFormatString="{0:¥#,###}"
                        HeaderText="total" HtmlEncode="False" SortExpression="total" />
                    <asp:TemplateField HeaderText="total Eval(&quot;total&quot;, &quot;{0:¥#,###}&quot;)" >
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text='<%# Eval("total", "{0:¥#,###}") %>' ></asp:Label>
                        </ItemTemplate>          
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>      
        </div>
        </form>
    </body>
    </html>

     

     

    > また、質問ですが、デ-タが、0の場合、画面表示を空白表示にしたいのですが、

     

    Text='<%# Memo(Eval("memo")) %>'  の例を参照ください。この Memo メソッド

    で Eval(#memo") が 0 のときは空白を返すようにすればよいと思います

     

    2008年8月6日 11:48
  • > また、質問ですが、デ-タが、0の場合、画面表示を空白表示にしたいのですが、

    >Text='<%# Memo(Eval("memo")) %>'  の例を参照ください。この Memo メソッド
    >で Eval(#memo") が 0 のときは空白を返すようにすればよいと思います。

    C#だとこんな感じですかね。VBならIIfが使えるのかな?
    Text='<%# (Eval("memo")== 0 ? "" : Eval("memo") %>'

    ちなみにMemo(string)のようにページビハインド側にメソッドを用意する場合は、
     1:Protectedで宣言する
     2:DB上の値がNullの場合、EvalからはDBNull.Valueが返されるため、値の比較の際は
          nullではなくDBNull.Valueを利用する
    の2点にお気をつけください。
    (注意:Evalの遅さを無視してます!)

    2008年8月6日 15:12
  • k-yamamoto 様へ

     

    回答ありがとうございました。

     

     

    >C#だとこんな感じですかね。VBならIIfが使えるのかな?
    >Text='<%# (Eval("memo")== 0 ? "" : Eval("memo") %>'

    回答のとおり、VBで、IIFを使用して、判定できました。

     

    >ちなみにMemo(string)のようにページビハインド側にメソッドを用意する場合は、
    >1:Protectedで宣言する
    >2:DB上の値がNullの場合、EvalからはDBNull.Valueが返されるため、値の比較の際は
    >     nullではなくDBNull.Valueを利用する
    >の2点にお気をつけください。

    ご指摘ありがとうございます。

    ご指摘のとおり、以下のようなエラーが、実行時に発生しました。

     

    このエラーを無くす、1、2の具体的なサンプルソースの提供をよろしくお願いします。

     

    演算子 '=' は 型 'DBNull' と 型 'Integer' に対して定義されていません。

     

    エラーソース

    <asp:TemplateField HeaderText="原価内容部材料" SortExpression="manterialkscost">
    行 145:                    <ItemTemplate>
    行 146:                        <asp:Label ID="Label14" runat="server" Text='<%# IIF(Eval("manterialkscost")=0,"",kaku(Eval("manterialkscost"))) %>'></asp:Label>
    行 147:                    </ItemTemplate>
    行 148:                </asp:TemplateField>
    2008年8月8日 1:17
  • SurferOnWww 様へ

     

    早速の回答ありがとうございました。

     

    提供されたソースを基に、修正して、確認できました。

    ありがとうございます。

     

    今度は、テーブルデータが、DBnullの場合の判定を設けたいので、サンプルソースの提供を是非よろしくお願いします。

     

    以上

    2008年8月8日 1:55
  • 先の例と同じく、

     

    id     int
    name   varchar(50)
    price  money
    memo   varchar(50)
    total  int

     

    という定義のテーブルで、price, memo, total が NULL または 0 のときは空白、
    数字が入っているときは ¥xxx,xxx,xxx のように表示できます。

     

    Code Snippet

    <%@ Page Language="VB" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
       
        Protected Function ChangeFormat(ByVal obj As Object) As String
            If TypeOf obj Is DBNull Then
                Return String.Empty
            ElseIf TypeOf obj Is Decimal Then
                Dim i As Decimal = CType(obj, Decimal)
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            ElseIf TypeOf obj Is Integer Then
                Dim i As Integer = CType(obj, Integer)
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            ElseIf TypeOf obj Is String Then
                Dim i As Int32 = Int32.Parse(CType(obj, String))
                If i = 0 Then
                    Return String.Empty
                Else
                    Return i.ToString("¥#,###")
                End If
            Else
                Return "Invalid Arg."
            End If
        End Function
       
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:databaseConnectionString %>"
                SelectCommand="SELECT [id], [name], [price], [memo], [total] FROM [table]">
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                DataKeyNames="id" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                        ReadOnly="True" SortExpression="id" />
                    <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />
                    <asp:TemplateField HeaderText="price (money)" >
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%# ChangeFormat(Eval("price")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="memo (varchar)">
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" Text='<%# ChangeFormat(Eval("memo")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="total (int)" >
                        <ItemTemplate>
                            <asp:Label ID="Label3" runat="server" Text='<%# ChangeFormat(Eval("total")) %>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>      
        </div>
        </form>
    </body>
    </html>

     

     

    2008年8月8日 3:19
  •  

    SurferOnWww 様へ

     

    早速の回答ありがとうござします。

     

    指摘どおり、修正して確認できました。ありがとうございます。

     

    同様に、文字列のDBデータが0の場合、空白表示、

    データに0以外の時、文字列を表示させたいのですが、よい方法を教えてください。

    回答されたソースもとに、修正して、試していますが、エラーになりうまくいきません。

    0のときは、空白を表示するのですが、値が、ABCとると、エラー 変換エラーになっています。

          

    Dim i As Int32 = Int32.Parse(CType(obj, String))箇所で、エラーになりました。

     

    例) データ 0   表示 空白

       データ ABC 表示 ABC

     

    できれば、再度、VBのサンプルソースの提供をよろしくお願いします。

    2008年8月8日 7:52
  • もともとの話は、

     

    > 100000と入力されたデータを金額イメージで画面に¥100,000と表示さ
    > せたいのですが、良い方法を教えてください。

     

    ということで、その方法は十二分に教えたと思っていますけど。

     

    さらに 0 のときは空白ということでそれも教えました。次に NULL のと
    きにも空白にということでそれも教えました。

     

    今度は 0 のときは空白で、その他の文字列はそのまま表示するのです
    か? どんどん話が変わってきていて、一体何がしたいのか訳がわかり
    ません。

     

    別の問題のようですので、このスレッドは閉じて、別にスレッドを立て
    て質問してください。

     


    別スレッドを立てる前に・・・

     

    > Dim i As Int32 = Int32.Parse(CType(obj, String))箇所で、エラー
    > になりました。

     

    Int32.Parse("ABC") がエラーになるのは当たり前です。このあたりは
    理解されているでしょうか。そのあたりが理解できていれば、今までの
    回答を参考に、回避策は見つかるはずです。一度よく考えてみてくださ
    い。

     

    2008年8月8日 11:42
  • SurferOnWww 様へ

     

    回答ありがとうございました。

     

    最初のQAは、ご指摘のとおりです。

    > 100000と入力されたデータを金額イメージで画面に¥100,000と表示さ
    > せたいのですが、良い方法を教えてください。

     

    この方法について、回答済みです。このスレッドは、回答済みで、クローズします。

    回答有難うございました。

     

    以下の部分は、内容が、いままでのQAと異なりますので、新しくQAをします。

    よろしくお願いします。

     

    >0 のときは空白で、その他の文字列はそのまま表示するのです
    >か? どんどん話が変わってきていて、一体何がしたいのか訳がわかり
    >ません。

    >別の問題のようですので、このスレッドは閉じて、別にスレッドを立て
    >て質問してください。

    2008年8月11日 1:06