トップ回答者
GridviewのTemplateFieldの値をソートしたい

質問
-
【開発環境】Visual Studio 2008 , Windows Server 2008 , SQL Server 2005 , ASP.NET 3.5(VB)
ASP.NETで「GridviewのTemplateFieldのItemTemplate」のなかにLabelを配置し、カスタムバインドで計算した値を表示するようにしています。
この値を、大きい順に並び替えたいのですが、方法が分からずに困っています。
<asp:TemplateField HeaderText="百分率">
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Math.Round(Eval("Column3")/(Eval("Column1")+Eval("Column2"))*100) %>'></asp:Label>パーセント
</ItemTemplate>
</asp:TemplateField>アドバイスの程、よろしくお願いいたします。
- 編集済み Lady CaCa 2015年2月6日 10:30 わかりやすいように訂正
回答
-
最初に言い忘れましたが、質問の内容に適切なフォーラムを選んで投稿するようお願いします。
Visual Studio Team System のフォーラムに投稿されてますが、質問内容からは ASP.NET のフォーラムが適切です。(注:このスレッドの移動は必要があれば管理者の方がやってくれますので、質問者さんはここを閉じて別のスレッドを立てたりしないで、このまま質問を続けてください)
・・・と、注文をつけるばかりでは何ですので、一つ案を書いておきます。
質問者さんが書かれた例のように、GridView にデータバインドするときに計算してその値を Label に書いたのでは、その後、ソートするには JavaScript / jQuery で何とかするほかなさそうです。
それでもよければ javascript table sort などでググるといくつか参考になるページが見つかると思います。それは ASP.NET の話ではないので質問者さんご自身で調べていただくとして、JavaScript / jQuery に頼らないでサーバー側だけで対応する案を紹介しておきます。
質問者さんのケースで可能かどうか分かりませんが、SELECT クエリで ROUND() 関数を使って「百分率」列の値を計算して取得するという方法があります。具体的には、
ROUND((100 * Column3) / (Column2 + Column1), 0) AS Percentage
を SELECT クエリに加えて、Percentage をデータバインドするということです。
そうすれば、先の私のレスに書いた (1) 初期画面で GridView が表示された時すでに並び替えられている必要がある、(2) 初期画面は順不同で良くてヘッダー等をクリックした時に並び替える・・・のいずれにも対応可能です。(「その他」は知りません)
Microsoft が提供するサンプルデータベース Northwind の Products テーブルを使ったコード例を以下にアップしておきます。(1) の場合はコード例の通り SELECT クエリに ORDER BY 句を含め、(2) の場合は削除してください。
<%@ 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"> </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:Northwind %>" SelectCommand= "SELECT ProductID, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, ROUND((100 * ReorderLevel) / (UnitsInStock + UnitsOnOrder), 0) AS Percentage FROM Products ORDER BY Percentage"> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" /> <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="UnitsInStock" /> <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" /> <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="ReorderLevel" /> <asp:BoundField DataField="Percentage" HeaderText="Percentage" ReadOnly="True" SortExpression="Percentage" /> </Columns> </asp:GridView> </div> </form> </body> </html>
上記の案で質問者さんの目的が果たせない場合は、具体的にどこが問題なのかを書いていただければ、別の案を考えてみます。- 回答としてマーク Lady CaCa 2015年2月8日 2:08
すべての返信
-
最初に言い忘れましたが、質問の内容に適切なフォーラムを選んで投稿するようお願いします。
Visual Studio Team System のフォーラムに投稿されてますが、質問内容からは ASP.NET のフォーラムが適切です。(注:このスレッドの移動は必要があれば管理者の方がやってくれますので、質問者さんはここを閉じて別のスレッドを立てたりしないで、このまま質問を続けてください)
・・・と、注文をつけるばかりでは何ですので、一つ案を書いておきます。
質問者さんが書かれた例のように、GridView にデータバインドするときに計算してその値を Label に書いたのでは、その後、ソートするには JavaScript / jQuery で何とかするほかなさそうです。
それでもよければ javascript table sort などでググるといくつか参考になるページが見つかると思います。それは ASP.NET の話ではないので質問者さんご自身で調べていただくとして、JavaScript / jQuery に頼らないでサーバー側だけで対応する案を紹介しておきます。
質問者さんのケースで可能かどうか分かりませんが、SELECT クエリで ROUND() 関数を使って「百分率」列の値を計算して取得するという方法があります。具体的には、
ROUND((100 * Column3) / (Column2 + Column1), 0) AS Percentage
を SELECT クエリに加えて、Percentage をデータバインドするということです。
そうすれば、先の私のレスに書いた (1) 初期画面で GridView が表示された時すでに並び替えられている必要がある、(2) 初期画面は順不同で良くてヘッダー等をクリックした時に並び替える・・・のいずれにも対応可能です。(「その他」は知りません)
Microsoft が提供するサンプルデータベース Northwind の Products テーブルを使ったコード例を以下にアップしておきます。(1) の場合はコード例の通り SELECT クエリに ORDER BY 句を含め、(2) の場合は削除してください。
<%@ 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"> </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:Northwind %>" SelectCommand= "SELECT ProductID, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, ROUND((100 * ReorderLevel) / (UnitsInStock + UnitsOnOrder), 0) AS Percentage FROM Products ORDER BY Percentage"> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" /> <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" SortExpression="UnitsInStock" /> <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" /> <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" SortExpression="ReorderLevel" /> <asp:BoundField DataField="Percentage" HeaderText="Percentage" ReadOnly="True" SortExpression="Percentage" /> </Columns> </asp:GridView> </div> </form> </body> </html>
上記の案で質問者さんの目的が果たせない場合は、具体的にどこが問題なのかを書いていただければ、別の案を考えてみます。- 回答としてマーク Lady CaCa 2015年2月8日 2:08
-
今さらながらで、かつ、質問者さんは気がついておられると思いますが、念のため書いておきます。
(1) 大きい順というのを見落としてました。その場合、ORDER BY 句に降順 (DESC) の指定が必要です。
(2) ROUND((100 * Column3) / (Column2 + Column1), 0) で Column1 ~ 3 が整数型ですと小数点以下は切り捨てになります。四捨五入としたい場合は 100 を 100.0 にするなどが必要です。
(3) 並び順は小数点以下も含めて決めたい(例えば、表示は同じ 12 でも 12.3 より 12.4 を先にしたい)と思います。その場合は ROUND 関数の第 2 引数を 2 とか 3 にしておき、書式設定で整数部のみ表示する(サンプルで言うと DataFormatString="{0:F0}" とする)のがいいと思います。
(4) 昔ながらの四捨五入ではなく、JIS 丸め(偶数丸め)にしたい場合は上記の方法では対応できません。Math.Round メソッド (Decimal, MidpointRounding) を使うなどの手段が必要です(そんな必要はないとは思いますが)。
- 編集済み SurferOnWww 2015年2月8日 5:11 誤記訂正 12.7 → 12.4