
前提
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





回答1件
あなたの回答
tips
プレビュー