December 21, 2021
DataGridViewでソート後に選択したデータを取得する方法(VB2008)
開発環境はVB2008、Win10です。
普段使ってる自作のツールの機能に社内ポータルの掲示板のデータを表示しようと思いつく。
最初はテキストボックスを並べてたけど、メンテやら拡張性がないので、DataGridViewに変更。
そう言えば見出し行をクリックするとデータの並べ替えが出来るよね。と改良を続ける。
Gridのタイトル一覧をクリックするとテキストボックスに詳細な内容を表示するんだが、どうも動きが怪しい。
ソート後にクリックしても、ソート前の詳細が表示されている。
DataGridViewのソートは見た目上並び替わっても、クリックした行の情報を取得するとソート前の情報が取得されてしまうようで。
ググりまくって何とか作成。サンプルコードを載せておきます。
どうやらDataViewって所にソート後のデータがあるようで。
なんかようわからんけど、とりあえず動いた。テスト中です。
修正前
CSVを読み込む → 配列に展開 → DataGridViewに展開
クリック → DataGridViewを参照
修正後
修正後
CSVを読み込む → 配列に展開 → DataTableに展開 → DataGridViewのDataSourceにセット
クリック → DataViewを参照
■サンプルコード
'DataGridViewの初期化、データ表示
Sub Sub_dgvBBS_Disp()
Dim shtIdx As Short
Dim strDate As String
Dim strBuf() As String
Dim strFlg As String
'ソート時にDatagridviewの表示内容と格納データがずれるのでDataViewに変更
'DataTableに配列(CSVから読み込んだデータ)からセット
Dim dt As New DataTable()
'列追加
dt.Columns.Add("F")
dt.Columns.Add("日時")
dt.Columns.Add("タイトル")
dt.Columns.Add("課名")
dt.Columns.Add("投稿日")
dt.Columns.Add("内容")
dt.Columns.Add("ファイル名")
'For shtIdx = 1 To UBound(pstrBBS, 1) 'CSVファイルを読み込みpstrBBS配列に格納している
For shtIdx = 1 To 10 'テスト用に10にしておく
'日時編集
'strDate = pstrBBS(shtIdx, C_B_HIDUKE).Substring(2, 2) & "/" & pstrBBS(shtIdx, C_B_HIDUKE).Substring(4, 2) & "/" & pstrBBS(shtIdx, C_B_HIDUKE).Substring(6, 2)
'strDate = strDate & " " & pstrBBS(shtIdx, C_B_JIKAN).Substring(0, 2) & ":" & pstrBBS(shtIdx, C_B_JIKAN).Substring(2, 2)
'行追加
'dt.Rows.Add(strFlg, strDate, pstrBBS(shtIdx, C_B_TITLE), pstrBBS(shtIdx, C_B_KAMEI), pstrBBS(shtIdx, C_B_UPDDATE).Substring(2, 14), pstrBBS(shtIdx, C_B_NAIYO), pstrBBS(shtIdx, C_B_FNAME))
'行追加 テスト用
dt.Rows.Add("flgデータ", "21/12/01 10:00", "タイトルデータ", "課名データ", "21/12/01 09:00", "内容データ", "添付ファイル名データ"))
Next
'ソート後のデータを取得の為、DataViewをセット
dgvBBS.DataSource = New DataView(dt)
With dgvBBS 'DataGridViewの名前はdgvBBS
.Visible = False
.Font = New Font("BIZ UDゴシック", 9) 'フォント設定
.Columns(C_DT_FLAG).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_HIDUKE).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_TITLE).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_KAMEI).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_UPDDATE).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_FLAG).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_HIDUKE).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_TITLE).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(C_DT_KAMEI).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(C_DT_UPDDATE).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(C_DT_NAIYO).Visible = False '表示を消す
.Columns(C_DT_FNAME).Visible = False '表示を消す
'ヘッダーとすべてのセルの内容に合わせて列幅を自動調整する
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
'ヘッダーとすべてのセルの内容に合わせて行高を自動調整する
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
'行選択モード
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
'For shtIdx = 0 To dgvBBS.RowCount - 1
' '背景色の設定
' If dgvBBS(C_DT_FLAG, shtIdx).Value = "未" Then
' strBuf = Split(CO_BLUE, ",")
' .Rows(shtIdx).DefaultCellStyle.BackColor = Color.FromArgb(strBuf(0), strBuf(1), strBuf(2))
' Else
' strBuf = Split(CO_WHITE, ",")
' .Rows(shtIdx).DefaultCellStyle.BackColor = Color.FromArgb(strBuf(0), strBuf(1), strBuf(2))
' End If
' Next
.Visible = True
End With
End Sub
'DataGridViewをクリックした時の処理
Private Sub dgvBBS_CellMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvBBS.CellMouseDown
Dim strBufMsg As String
If e.RowIndex < 0 Then
Exit Sub
End If
'DataViewを取得
Dim view As DataView = CType(dgvBBS.DataSource, DataView)
'内容 等をテキストボックに表示する
strBufMsg = view(e.RowIndex).Item(C_DT_KAMEI) & " 投稿日:" & view(e.RowIndex).Item(C_DT_UPDDATE) & vbNewLine & vbNewLine
strBufMsg = strBufMsg & Replace(view(e.RowIndex).Item(C_DT_NAIYO), "<BR>", vbNewLine)
Me.txtMsg.Text = strBufMsg
Me.lblDate51.Text = view(e.RowIndex).Item(C_DT_HIDUKE)
Me.lblTitle51.Text = view(e.RowIndex).Item(C_DT_TITLE)
Me.lblKind.Text = "イントラ掲示板"
Me.lblUpdate.Text = pdteBBSUpdate.ToString("yy/MM/dd HH:mm") & " 更新"
End Sub
ソートすると背景色設定がクリアされるので
dgvBBS_CellMouseUp 処理内で再設定する。
参考になれば。
参考になれば。