accessから読み込んだデータをソースとしてgridviewで表示し、任意の列を数値の大小で並べ替えるアプリを作成しています。
accessのテーブルは、元となるexcelファイルから外部データのリンクで取得しているため、各列のデータの型を指定出来ない状況です。
一部の列は、数値と文字列が混在してしまっているのですが、そのような列でも数値が入力されている行だけまず並び替えて、続いて文字列を並び替えるというような動作をさせたいと考えています。
excelの並び替えでは上記のような動作をするので、それが理想です。
gridviewにはAllowSorting="True"とするだけでソートできるようになる機能がありますが、これだと型が短いテキストとなっている列では
1→10→2→20→30→あいうえお
というように並べ替えられてしまいます。
これを
1→2→10→20→30→あいうえお
となるようにするにはどのようにすればよいでしょうか?
test.aspx
aspx
1<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="sorttest.aspx.vb" Inherits="test.sorttest" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9 <style type="text/css"> 10 th.sortedAscHeader, 11 th.sortedDscHeader { 12 background-repeat: no-repeat; 13 background-position: right; 14 padding-right:18px; 15 } 16 17 th.sortedAscHeader { 18 background-image: url(Images/arrow-up.png); 19 } 20 21 th.sortedDscHeader { 22 background-image: url(Images/arrow-down.png); 23 } 24 </style> 25 26</head> 27<body> 28 <form id="form1" runat="server"> 29 <div> 30 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 31 <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" OnSorting="onsorting" PageSize="60" DataKeyNames="フィールドA"> 32 <Columns> 33 <asp:CommandField ShowSelectButton="True" /> 34 <asp:BoundField DataField="フィールドA" HeaderText="フィールドA" SortExpression="フィールドA" /> 35 <asp:BoundField DataField="フィールドB" HeaderText="フィールドB" SortExpression="フィールドB" /> 36 <asp:BoundField DataField="フィールドC" HeaderText="フィールドC" SortExpression="フィールドC" /> 37 </Columns> 38 <SortedAscendingHeaderStyle CssClass="sortedAscHeader" BackColor="#FFCCFF" /> 39 40 <SortedDescendingHeaderStyle CssClass="sortedDscHeader" BackColor="#99CCFF" /> 41 42 43 </asp:GridView> 44 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString3 %>" ProviderName="<%$ ConnectionStrings:ConnectionString3.ProviderName %>" SelectCommand="SELECT * FROM [sorttest]"></asp:SqlDataSource> 45 46 <asp:HiddenField ID="hiddenselectcommand" runat="server" /> 47 <br /> 48 <br /> 49 </div> 50 </form> 51</body> 52</html> 53 54
test.aspx.vb
VB
1 2Public Class sorttest 3 Inherits System.Web.UI.Page 4 5 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 6 SqlDataSource1.SelectCommand = "Select * FROM [sorttest]" & hiddenselectcommand.Value 7 8 End Sub 9 10 11 Protected Sub OnSorting(sender As Object, e As GridViewSortEventArgs) Handles GridView1.Sorting 12 13 Dim field As String = e.SortExpression 14 Dim direction As String 15 Dim selectcommandstr As String = SqlDataSource1.SelectCommand 16 17 18 If selectcommandstr.IndexOf("ASC") <> -1 Then 19 direction = "DESC" 20 Else 21 direction = "ASC" 22 End If 23 If selectcommandstr.IndexOf("order") <> -1 Then selectcommandstr = selectcommandstr.Remove(selectcommandstr.IndexOf("order")) 24 selectcommandstr = selectcommandstr & " order by IsNumeric([" & field & "]), Val([" & field & "]) " & direction & ", [" & field & "] " & direction & "" 25 26 27 SqlDataSource1.SelectCommand = selectcommandstr 28 29 If selectcommandstr.IndexOf("where") <> -1 Then 30 selectcommandstr = selectcommandstr.Remove(0, selectcommandstr.IndexOf("where")) 31 Else 32 33 If selectcommandstr.IndexOf("order") <> -1 Then 34 selectcommandstr = selectcommandstr.Remove(0, selectcommandstr.IndexOf("order")) 35 Else 36 selectcommandstr = "" 37 End If 38 End If 39 40 hiddenselectcommand.Value = selectcommandstr 41 42 e.Cancel = True 43 44 End Sub 45 46 Protected Sub GridView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GridView1.SelectedIndexChanged 47 TextBox1.Text = GridView1.SelectedValue.ToString 48 End Sub 49End Class 50
上記とすることで、gridviewのヘッダーをクリックするたびに昇順降順を切り替えて
昇順
1→2→10→20→30→あい→うえお
降順
30→20→10→2→1→うえお→あい
と並び替えられるようになりました、が、
e.cancelとしていることでgridviewの機能としては並び替わったことにならないため、SortedAscendingHeaderStyleが反映されなくなってしまいました。
できれば並び替わっている列とその向きがわかるようにしたいのですが、gridviewのsortイベントを介さずにgiridviewに現在並び替えられているフィールドとその向きを設定するなどして、すでに並び替わったことに出来ないでしょうか。
gridview.SortDirectionを書き換えようとしてみましたが、readonlyのため無理なようでした。
追加ですみませんが、ご存知の方がいらっしゃいましたら教えて下さい。
回答3件
あなたの回答
tips
プレビュー