DataGridViewにファイル一覧

タグの編集
投稿者 xvmmtnk  (中学生) 投稿日時 2011/11/5 16:13:14
DataGripdViewにファイルの一覧を追加させたいのですが、下のコードを試しても、何も出てきません。
どうすれば、一覧を追加できますか?

    Public Sub ListLoad()
        Dim files As String() = System.IO.Directory.GetFiles( _
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Bvets\Scenarios""*.txt", System.IO.SearchOption.TopDirectoryOnly)

        Dim DataSet As New DataSet("Files")

        For i = 0 To files.Length - 1

            Dim sr As New System.IO.StreamReader(files(i), _
    System.Text.Encoding.GetEncoding("shift_jis"))

            Dim table As New DataTable
            Dim r_image As String = ""
            Dim r_title As String = ""
            Dim r_author As String = ""
            Dim r_comment As String = ""
            Dim dataClumn1 As DataColumn = table.Columns.Add("画像"GetType(Image))
            Dim dataClumn2 As DataColumn = table.Columns.Add("路線名")
            Dim dataClumn3 As DataColumn = table.Columns.Add("製作")
            Dim dataClumn4 As DataColumn = table.Columns.Add("説明")
            Dim dgTable As DataGridTableStyle = New DataGridTableStyle
            Dim dgColumn1 As DataGridTextBoxColumn = New DataGridTextBoxColumn
            Dim dgColumn2 As DataGridTextBoxColumn = New DataGridTextBoxColumn
            Dim dgColumn3 As DataGridTextBoxColumn = New DataGridTextBoxColumn
            Dim dgColumn4 As DataGridTextBoxColumn = New DataGridTextBoxColumn

            dgTable.MappingName = table.TableName

            dgColumn1.MappingName = dataClumn1.ColumnName
            dgColumn2.MappingName = dataClumn2.ColumnName
            dgColumn3.MappingName = dataClumn3.ColumnName
            dgColumn4.MappingName = dataClumn4.ColumnName

            dgColumn1.Width = 100
            dgColumn2.Width = 100
            dgColumn3.Width = 100
            dgColumn4.Width = 100

            dgTable.GridColumnStyles.Add(dgColumn1)
            dgTable.GridColumnStyles.Add(dgColumn2)
            dgTable.GridColumnStyles.Add(dgColumn3)
            dgTable.GridColumnStyles.Add(dgColumn4)

            '内容を一行ずつて読み込む 
            While sr.Peek() > -1
                Dim rs As String = sr.ReadLine()
                If rs.Contains("Image = "Then
                    r_image = rs.Replace("Image = "Nothing).ToString
                ElseIf rs.Contains("RouteTitle = "Then
                    r_title = rs.Replace("RouteTitle = "Nothing).ToString
                ElseIf rs.Contains("Author = "Then
                    r_author = rs.Replace("Author = "Nothing).ToString
                ElseIf rs.Contains("Comment = "Then
                    r_comment = rs.Replace("Comment = "Nothing).ToString
                End If
            End While

            '閉じる 
            sr.Close()

            Dim a_image As Image
            a_image = Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Bvets\Scenarios\" & r_image)
            table.Rows.Add(a_image, r_title, r_author, r_comment)
            DataSet.Tables.Add(table)
        Next
        DataGridView1.DataSource = DataSet
    End Sub
投稿者 るきお  (社会人) 投稿日時 2011/11/6 11:47:41
DataGridViewに複数のDataTableを同時に「表示」することはできません。
つまり、DataSetには複数のDataTableが含まれている可能性があるのでDataSetをDataGridViewに渡してあとは自動的に表示されるということはありません。

xvmmtnkさんの例では複数のDataTableを含むDataSetを表示しようとしています。
今回の例ではたまたまDataTableの列が一致しているので、結合して表示してくれてもいいように感じるかもしれませんが、DataSetに含まれているDataTableの列が常に一致しているとは限らず、プログラマー側で表示方法を指定しない限りVBはこれらを自動的に処理してくれません。

技術的に一番簡単な解決方法は、
①単一のDataTableのみ扱いDataGridViewにはDataTableを渡すか、
②表示するDataTableを指定する
方法です。
私は構造的にシンプルな①をお勧めします。

①の例
    
Dim table As New DataTable

table.Columns.Add("TEST"GetType(String))
table.Rows.Add("AAA")
table.Rows.Add("BBB")
table.Rows.Add("CCC")

DataGridView1.DataSource = table


②の例
    
Dim dataset As New DataSet
Dim table As New DataTable("MyTable")

table.Columns.Add("TEST"GetType(String))
table.Rows.Add("AAA")
table.Rows.Add("BBB")
table.Rows.Add("CCC")

dataset.Tables.Add(table)

DataGridView1.DataMember = "MyTable"
DataGridView1.DataSource = dataset
投稿者 xvmmtnk  (中学生) 投稿日時 2011/11/6 23:04:54
ありがとうございます!
実行できました!
Public Sub ListLoad()
        Dim files As String() = System.IO.Directory.GetFiles( _
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Bvets\Scenarios""*.txt", System.IO.SearchOption.TopDirectoryOnly)

        Dim table As New DataTable
        Dim dataClumn1 As DataColumn = table.Columns.Add("画像"GetType(Image))
        Dim dataClumn2 As DataColumn = table.Columns.Add("路線名")
        Dim dataClumn3 As DataColumn = table.Columns.Add("製作")
        Dim dataClumn4 As DataColumn = table.Columns.Add("説明")
        Dim dataClumn5 As DataColumn = table.Columns.Add("ファイル名")



        For i = 0 To files.Length - 1

            Dim sr As New System.IO.StreamReader(files(i), _
    System.Text.Encoding.GetEncoding("shift_jis"))

            Dim r_image As String = ""
            Dim r_title As String = ""
            Dim r_author As String = ""
            Dim r_comment As String = ""


            '内容を一行ずつて読み込む 
            While sr.Peek() > -1
                Dim rs As String = sr.ReadLine()
                If rs.Contains("Image = "Then
                    r_image = rs.Replace("Image = "Nothing).ToString
                ElseIf rs.Contains("RouteTitle = "Then
                    r_title = rs.Replace("RouteTitle = "Nothing).ToString
                ElseIf rs.Contains("Author = "Then
                    r_author = rs.Replace("Author = "Nothing).ToString
                ElseIf rs.Contains("Comment = "Then
                    r_comment = rs.Replace("Comment = "Nothing).ToString
                End If
            End While

            '閉じる 
            sr.Close()

            Dim imgFl As String = (Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Bvets\Scenarios\" & r_image)

            Dim a_image As Image

            If File.Exists(imgFl) Then
                a_image = New Bitmap(Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\Bvets\Scenarios\" & r_image), 120, 90)
            Else
                a_image = New Bitmap(My.Resources.noimage, 120, 90)
            End If

            table.Rows.Add(a_image, r_title, r_author, r_comment, files(i).ToString)
        Next i
        DataGridView1.DataSource = table
    End Sub

↓実行後↓