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

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

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

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

Q&A

解決済

1回答

945閲覧

DataGridViewのソート(複数キー)がうまくいかない

iwaka

総合スコア8

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

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

0グッド

0クリップ

投稿2022/09/07 03:46

編集2022/09/07 05:09

前提

vb.netでWindowsFormアプリケーションを作っています。
データベースからテーブルIDを取得してDataGridViewに表示させます。
configに書いてあるテーブルIDは出力対象チェックONの状態で表示します。
そのときにテーブルIDを全件表示するときは思い通り(出力対象チェックがONのテーブルIDを上位かつテーブルID順)にソートしてくれるのですが、検索してテーブルIDを絞るとソートが思い通りの順番になりません。
dv.sortの手前のdvの中身は正しいことが確認できたので、ソートに問題があると思っているのですが解決策がわかりません。

(例)
CE01
CE03
CE05
と表示したいのに
CE03
CE05
CE01
となってしまいます。

実現したいこと

DataGridViewにテーブルを表示するさいに、出力対象チェックがONのテーブルIDを上位かつテーブルID順で表示させたいです。

該当のソースコード

mainform

1Private Sub GetTable_Click(sender As Object, e As EventArgs) Handles GetTable.Click 2 Dim ret As Integer 3 Dim cmd As New SqlCommand 4 cmd.CommandType = CommandType.Text 5 cmd.Connection = _conn 6 cmd.CommandText = "USE " & DBNAME.SelectedItem.ToString 7 8 Try 9 ret = cmd.ExecuteNonQuery 10 Catch ex As Exception 11 End Try 12 13 If _dt IsNot Nothing Then 14 _dt.Dispose() 15 _dt = New DataTable 16 End If 17 18 If Not MainModule.Init(_conn, _dt, TableID.Text) Then 19 MsgBox(_message3, MsgBoxStyle.Information) 20 Exit Sub 21 End If 22 23 If _dt.Rows.Count > 0 Then 24 GridView.DataSource = _dt 25 GridView.ReadOnly = False 26 GridView.Columns(0).HeaderText = "テーブルID" 27 GridView.Columns(0).ReadOnly = True 28 GridView.Columns(0).Width = 300 29 GridView.Columns(0).DisplayIndex = 1 30 GridView.Columns(1).HeaderText = "出力対象" 31 GridView.Columns(1).Width = 80 32 GridView.Columns(2).Visible = False 33 GridView.Columns(3).HeaderText = "ファイル№(DELETE)" 34 GridView.Columns(3).Width = 80 35 DirectCast(GridView.Columns(3), DataGridViewTextBoxColumn).MaxInputLength = 3 36 GridView.Columns(3).ReadOnly = True 37 GridView.Columns(4).Visible = False 38 GridView.Columns(5).HeaderText = "ファイル№(INSERT)" 39 GridView.Columns(5).Width = 80 40 DirectCast(GridView.Columns(5), DataGridViewTextBoxColumn).MaxInputLength = 3 41 GridView.Columns(5).ReadOnly = True 42 GridView.Columns(6).Visible = False 43 GridView.Columns(7).HeaderText = "作成結果" 44 GridView.Columns(7).Width = 80 45 GridView.Columns(7).ReadOnly = True 46 Else 47 GridView.DataSource = Nothing 48 MsgBox(_message3) 49 Exit Sub 50 End If 51 52 Dim テーブルID As String() = My.Settings.テーブルID.Split(",") 53 For i As Integer = 0 To GridView.Rows.Count - 1 54 For j As Integer = 0 To テーブルID.Length - 1 55 If GridView.Rows(i).Cells(0).Value = テーブルID(j) Then 56 GridView.Rows(i).Cells(1).Value = True 57 GridView.Rows(i).Cells(3).ReadOnly = False 58 GridView.Rows(i).Cells(5).ReadOnly = False 59 End If 60 Next 61 Next 62 63 For i As Integer = 0 To GridView.Rows.Count - 1 64 If GridView.Rows(i).Cells(1).Value = True Then 65 GridView.Rows(i).Cells(2).Value = 1 66 End If 67 Next 68 69 Dim dt1 As DataTable = CType(GridView.DataSource, DataTable) 70 Dim dv As DataView = dt1.DefaultView 71 dv.Sort = "DUMMY1 DESC, テーブルID ASC"

mainmodule

1Public Function Init(ByRef conn As SqlConnection, ByRef dt As DataTable, ByVal tableId As String) As Boolean 2 Init = False 3 _errmsg = "" 4 5 Try 6 _conn = conn 7 8 If Not Readパラメータ(dt, tableId) Then 9 If _errmsg.Length > 0 Then 10 Makelog() 11 End If 12 Return False 13 End If 14 15 If dt.Rows.Count > 0 Then 16 With dt 17 .Columns(0).ColumnName = "テーブルID" 18 .Columns.Add("DUMMY", GetType(Boolean)) 19 .Columns.Add("DUMMY1", GetType(Integer)) 20 .Columns.Add("DUMMY2", GetType(String)) 21 .Columns.Add("DUMMY3", GetType(Integer)) 22 .Columns.Add("DUMMY4", GetType(String)) 23 .Columns.Add("DUMMY5", GetType(Integer)) 24 .Columns.Add("DUMMY6", GetType(String)) 25 End With 26 27 For Each wk As DataRow In dt.Rows 28 wk("DUMMY") = False 29 Next 30 For Each wk As DataRow In dt.Rows 31 wk("DUMMY1") = 0 32 Next 33 For Each wk As DataRow In dt.Rows 34 wk("DUMMY2") = "" 35 Next 36 For Each wk As DataRow In dt.Rows 37 wk("DUMMY3") = 1000 38 Next 39 For Each wk As DataRow In dt.Rows 40 wk("DUMMY4") = "" 41 Next 42 For Each wk As DataRow In dt.Rows 43 wk("DUMMY5") = 1000 44 Next 45 For Each wk As DataRow In dt.Rows 46 wk("DUMMY6") = "" 47 Next 48 End If 49 50 Init = True 51 If _errmsg.Length > 0 Then 52 Makelog() 53 End If 54 55 Catch ex As Exception 56 57 End Try 58 59 End Function 60 61 Private Sub Makelog() 62 My.Computer.FileSystem.WriteAllText("errlog.txt", _errmsg, False) 63 MsgBox("エラーがあります。エラーファイルを確認ください。") 64 End Sub 65 66 Private Function Readパラメータ(ByRef dt As DataTable, ByVal tableId As String) As Boolean 67 Readパラメータ = False 68 Try 69 Dim reader As SqlDataReader 70 Dim cmd As New SqlCommand 71 cmd.CommandType = CommandType.Text 72 cmd.Connection = _conn 73 74 If tableId = "" Then 75 '全件取得 76 cmd.CommandText = "省略" 77 Else 78 '検索結果のみ取得 79 cmd.CommandText = "省略" 80 End If 81 82 Try 83 84 reader = cmd.ExecuteReader() 85 Dim datatable As New DataTable 86 Using reader 87 If reader.HasRows Then 88 datatable.Load(reader) 89 dt = datatable.Copy 90 reader.Close() 91 End If 92 End Using 93 datatable.Dispose() 94 95 Catch ex As Exception 96 MsgBox(ex.Message, MsgBoxStyle.Critical) 97 Exit Function 98 Finally 99 End Try 100 101 Return True 102 103 Catch ex As Exception 104 MsgBox(ex.Message, MsgBoxStyle.Critical) 105 End Try 106 107 End Function

試したこと

gridview.sort()は第二キーの設定の仕方がわからず、調べていたらdataview.sort()でできそうだと思い実装してみました。

補足情報(FW/ツールのバージョンなど)

Windows10、VisualStudio2017、.NET Framework 4.6.1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/09/07 04:49 編集

何を作っているのかぐらいは書きましょうよ。ASP.NET Web Forms? WPF? その他?  ASP.NET の話なら ASP.NET のタグをつけてください。 開発環境を書きましょう。OS, .NET Framework なのか .NET Core/.NET のどっちなのかとそのバージョンなど。
YAmaGNZ

2022/09/07 04:45

「出力対象チェックがON」とのことですが、提示されているソースが「DUMMY」等となっているので何のことか不明です。 またONと仰っているのでBooleanの値かと思いましたが、ソートはIntegerの値に対して行っているようです。 実際にどの項目に対してソートをかけているのでしょうか?
iwaka

2022/09/07 04:55

YAmaGNZさん DUMMY列(出力対象チェック列)が「TRUE」の場合DUMMY1列に「1」を入れて、DUMMY1列に対してソートをかけています。
退会済みユーザー

退会済みユーザー

2022/09/07 04:59

> WindowsFormアプリケーションを作っています。データベースからテーブルIDを取得してgridviewに表示させます。 Windows Forms アプリというのは間違いないですか? 間違いないとすると GridView ではなくてDataGridView の間違いではないですか? GridView というのは自分が知る限り System.Windows.Controls 名前空間 (WPF) のものと System.Web.UI.WebControls 名前空間 (ASP.NET) のもの以外には見当たりませんでしたけど。サードパーティ製の何か?
iwaka

2022/09/07 05:02 編集

SurferOnWwwさん すみません、DataGridViewです。ソースの中でgridviewを使っていたのでそのまま記載してしまいました。修正します。
退会済みユーザー

退会済みユーザー

2022/09/07 05:07

タイトルも DataGridView に書き直してください。
退会済みユーザー

退会済みユーザー

2022/09/07 05:49 編集

以下の記事のようにデータソース構成ウィザードを使って型付 DataSet/DataTable + TableAdapter を作ってから、その記事の Data Sources window のセクションにあるようにドラッグ&ドロップして DataGridView を自動生成させれば、ソート機能も実装されていて、アプリを実行してヘッダをクリックすればソートするのですが、それでは機能が不足なのですか? Add new data sources https://docs.microsoft.com/en-us/visualstudio/data-tools/add-new-data-sources?view=vs-2022
YAmaGNZ

2022/09/07 06:48

DataTableをDataSourceに設定した後DataGridViewの値を変更するのではなく DataTableの値を変更してからDataGridViewのDataSourceに設定しましょう。
guest

回答1

0

自己解決

下記のようにlinqを使ったら検索で絞っても思い通りのソートができました。
ありがとうございました。

MainForm

1  ↓コメントアウト 2 For i As Integer = 0 To GridView.Rows.Count - 1 3 If GridView.Rows(i).Cells(1).Value = True Then 4 GridView.Rows(i).Cells(2).Value = 1 5 End If 6 Next 7 8 Dim dt1 As DataTable = CType(GridView.DataSource, DataTable) 9 Dim dv As DataView = dt1.DefaultView 10 dv.Sort = "DUMMY1 DESC, テーブルID ASC" 11   ↑コメントアウト 12   ↓追加 13 Dim query = From row In _dt Order By row("DUMMY") Descending, row("テーブルID") Select row 14 _sorteddt = query.CopyToDataTable() 15 GridView.DataSource = _sorteddt 16   ↑追加

投稿2022/09/07 08:16

iwaka

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/09/08 09:19

Linq を使ったから云々は関係なくて、YAmaGNZ さんの 2022/09/07 15:48 のコメントのようにしたからでしょう。自己解決というのはいかがなものかと思いますけど。 あと、2022/09/07 14:49 の私のコメントの話は少しは考えてもらえてのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問