December 21, 2021

DataGridViewでソート後に選択したデータを取得する方法(VB2008)

DataGridView
開発環境は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 処理内で再設定する。

参考になれば。





    このエントリーをはてなブックマークに追加 mixiチェック

コメントする

名前
 
  絵文字
 
 
Counter
  • 今日:
  • 昨日:
  • 累計:

Counter

    Archives
    Categories
    記事検索
    QR Code
    QRコード
    ギャラリー
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 京都 2022/4/29〜5/1
    • 『Anker PowerPort III 3-Port 65W Pod』を買ってみたのでいろんな充電器とサイズ比較
    • 『Anker PowerPort III 3-Port 65W Pod』を買ってみたのでいろんな充電器とサイズ比較
    • 『Anker PowerPort III 3-Port 65W Pod』を買ってみたのでいろんな充電器とサイズ比較
    • Excel VBAで既定のメールアプリでメールを作成する方法
    GEMS RSS
    Recent Comments
    楽天
    楽天で探す
    楽天市場
    • ライブドアブログ