質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

解決済

gridviewで数値と文字列が混在している際に数値の大小順に並べ替えたい

tkm_43522
tkm_43522

総合スコア10

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

3回答

0評価

0クリップ

705閲覧

投稿2021/05/17 05:58

編集2021/05/19 00:15

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のため無理なようでした。

追加ですみませんが、ご存知の方がいらっしゃいましたら教えて下さい。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2021/05/17 06:49

文字列としてソートしていると思いますが、その場合は元の文字列を「01 02 10 20 30 あいうえお」としないと何ともならないかと。それができなければ列を数字と文字で別に分けるとか、組み込みのソート機能ではなく自力で実装するとかしないと手はなさそうですが、そこまでやる気はありますか?
tkm_43522

2021/05/17 07:09

gridviewはsqldatasourceでデータをbindしているので、gridview.sortingイベントが発生したときにsqldatasourceをbindされる前に下記リンクのようにORDER BY CAST(〇〇 as int)のように並び替えられないかなと考えているのですが、gridview.sortingイベントをどのように捕まえるのか、捕まえられたとして、組み込みのソート機能と想定しているbind前の並び替えのどちらが後に起こるのかなど、さっぱりわからないでいます。 https://kojimanotech.com/2020/11/19/267/ 方法があるのなら、自力で実装するのに挑戦したいと考えておりますが、ご教示いただけると大変助かります。
SurferOnWww

2021/05/17 07:46 編集

> 下記リンクのようにORDER BY CAST(〇〇 as int)のように並び替えられないかな それは「ORDER BY するときにint型にCASTすることで解決します」という話なので、"あいうえお" とかが混ざっていたら何ともならないはずです。 > 組み込みのソート機能と想定しているbind前の並び替えのどちらが後に起こるのかなど、さっぱりわからないでいます。 SqlDataSource + GridView の機能を使ってソートを行う場合、(1) GridView のヘッダのリンクボタンのクリックによってポストバックが起こる、(2) サーバー側ではそれを受けて Access から SqlDataSource 経由でデータを取得、(3) 取得したデータから DataView を作って、その Sort プロパティ に SortExpression を設定、(4) それによりソートされた結果を GirdView に表示する・・・という動きになっています。 > 方法があるのなら、自力で実装するのに挑戦したいと考えておりますが、 上記の動作を何とかして希望の動作をできるようにするには、(3) ~ (4) に大幅な手を加える必要があると思いますが、できますか?
tkm_43522

2021/05/17 09:05

ありがとうございます。 おっしゃる通り、試しにsqldatasource.selectcommandにORDER BY CAST(〇〇 as int)としてしまうとエラーが出てしまいました。ですが、saziさんにご助言いただいたように、 order by IsNumeric([フィールド]), Val([フィールド]), [フィールド] とすると、はじめに数値が並び、続いて文字列が並ぶという様に並べ替えられました。 クエリ文で希望するように並べ替えが可能ということがはわかったので、(2)でクエリ文でデータ取得、続いて(3)を飛ばして, (4)ができれば良いという理解で良いでしょうか?
SurferOnWww

2021/05/17 12:40 編集

> クエリ文で希望するように並べ替えが可能ということがはわかったので、(2)でクエリ文でデータ取得、続いて(3)を飛ばして, (4)ができれば良いという理解で良いでしょうか? 自分的にはどう考えても違うと思います。 初期画面でソートされていればそれだけで良いということなら話は違うかもしれませんが・・・ 何にせよ、全体的に何をしたいのか不明ですので的確なアドバイスはできません。 実際に手を動かしてやってみたら、その課程で突破口が見つかるかもしれませんので、人に聞くよりとにかく自分の手を動かしてやってみてはいかがですか。
SurferOnWww

2021/05/18 01:11

上のコメントに、 > 初期画面でソートされていればそれだけで良いということなら話は違うかもしれませんが・・・ と書きましたが、それを回答欄に書いておきます。質問者さんのやりたいことと違う場合は、どこがどのように違うのか回答のコメント欄に書いてください。
SurferOnWww

2021/05/20 01:31

解決したようですのでベストアンサーを選んでクローズしてください。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。