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