• 締切済み

ファイルの一覧を取得して配列に入れるには(VB2005)

VisualBasic2005でプログラミングの勉強を始めましたが、配列のところで躓いてしまいました。 現在やりたいことは、ListBoxとDataGridViewにそれぞれ取得したファイルのファイル名を一覧を表示し、項目クリックでそのファイルを開くことです。(DataGridViewのほうは、ファイルの一覧だけでなく、項目を分けてパスやファイルサイズなども表示させたいと思います)。 まずListBoxのほうですが、検索して次のような方法が見つかりました。 ListBox1.DataSource = _ My.Computer.FileSystem.GetFiles("パス",FileIO.SearchOption.SearchTopLevelOnly,"*.拡張子") そのままコピーして利用してみたのですが、直接リストボックスに一覧を取得し、パスも含めた文字列が表示されてしまいました。リストボックスにはパスと拡張子を除いたファイル名だけを一覧表示したいです。それで、各文字列を操作するためにはまず取得したファイル一覧を配列かコレクションに格納しなければならないと思うのですが、この方法がどうしてもわかりません(また、配列とコレクションではどちらが相応しいでしょうか)。 また、DataGridViewでもパスやサイズも含めた一覧を表示し、同様にクリックで開けるようにしたいと思います。この場合も、まず多次元配列に検索結果を入れると思うのですが、データを入れた配列から、DataGridViewに表示させる方法も合わせて教えていただきたく思います。 以上のことについて、アドバイスまたは方法をご教授ください<(_ _)> 検索していると、 DataGridView1.datasource = DataTable ListBox1.datasource = ~~~ などという例が多いのですが、DataTableやdatasourceと配列はどのような関係にあるのでしょうか?DataTableのデータを配列に入れたり、またその逆だったりは簡単に出来ないものでしょうか。 このあたりがどうも理解不足で、応用力もつけたいので、どのあたりを勉強すればよいのかも教えて頂けると助かります。初心者用の参考書と、逆引き大全500は一通り読んでみました。

みんなの回答

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

No1です。 ListBox部分の訂正です。 ListBox のdatasource は Dataset でなくても大丈夫です。 ●ListBOX まず ListBox を フォームに名前を MYListBoxを作成してください。 あとはさきのコードと同じようにDATATABLE にファイル名を ADD してファイル名データリストを作成します。 これを ListBox の DataSource に割り当てるだけです。 ____________________________ Dim Dr As String = Nothing Dim strdir As String = Nothing Dim Idx As Integer = 0 Dim strCnm As String = Nothing Dim Wr As DataRow Dim dt As New DataTable("MyDTBL") dt.Columns.Add("Fname") Dr = Dir("c:\*.*") Do Until Len(Dr) = 0 Wr = dt.NewRow() Wr.Item(0) = Dr dt.Rows.Add(Wr) Idx += 1 Dr = Dir() Loop myListBox.DataSource = dt myListBox.DisplayMember = "Fname" ____________________________________________________ これでできます。

new_hope
質問者

お礼

ここが3番目の書き込みです。 わかりにくい書き方ですみません。 DataTableの内容を配列に入れる方法ですが、 徹夜で検索してなんとかできるようになりました。 基本的にはこんな感じでよかったんですね。 Dim csvArray(DT.Rows.Count, DT.Columns.Count) As String csvArray(0,0) = DT.Rows(0)(0) 質問をしておきながら一人で空回りしてしまい、すみません。 どうもありがとうございました<(_ _)>

new_hope
質問者

補足

お返事遅くなりましてすみません。 ご丁寧にサンプルも書いていただきまして、ありがとうございます。どうも僕の質問のしかたがメチャクチャだったようで、知りたいのは本当に基本的なことだったみたいです。 CSVファイルの内容を、多次元配列に格納するにはどうしたらいいか、というのが本来の質問でした。もしくは、DataTableに入れたデータを、配列に移し変える方法です。CSVファイルのデータを習得するのは、サンプルなどを見よう見まねでコピペして実現できたのですが、サンプルではデータの格納先がDatatableだったので、項目の参照の仕方や書き換え方がわかりませんでした。 ListBox.Datasource = DataTable としてそのままDataGridViewやListBoxに表示してしまう以外、表示する前にデータをいじる方法がわかりません。参考書でデータベースのあたりを参照してみたりもしているのですが、Accessすら使ったことが無いもので概念的なことがまだ理解できず、Datatableのいじり方や配列へのデータの受け渡し方法などは見つけることも出来ませんでした。(そもそも配列とDataTableは用途にどのような違いがあるのかも・・・)。 今まで勉強して配列なら一通りの操作がわかるので、DataTableに取得した内容を一旦配列に入れなおすか、CSVの内容をDataTableではなく直接配列に入れる方法を知りたいと思いました。今の知識でできることは、一旦ListBoxに表示してそれを改めて各項目を配列にセットしなおすということなのですが、あまりにもスマートじゃない気がします。 きっとすごく基本的なことだと思いますが、何卒アドバイスいただきたく思います。 それから、CSVはたくさんありまして、それぞれのCSVからロードしたデータをプログラムの中でいろいろと利用したいのですが、DataTableに入れておくのと多次元配列に入れておくのでは、それぞれどのような違いやメリットがあるのでしょうか。重ね重ね恐れ入りますが、このあたりもなにかご教授頂きたいです。 よろしくお願いします<(_ _)>

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

つまり、エクスプローラみたいな TreeView がつくりたいのかな?? ただ単に DataGridView に取得したファイル名を表示したいのなら DATATABLE と Dir 関数を用いれば簡単にできます。 DATATABLE にファイル名を ADD してファイル名データリストを作成します。 その後、DataGridViewのDataSource にDATATABLE をいれていれるだけです。 まず DataGridView を フォームに名前を MYDataGridView を作成してください。 ______________________________ Dim Dr As String = Nothing Dim strdir As String = Nothing Dim Idx As Integer = 0 Dim strCnm As String = Nothing Dim Wr As DataRow Dim dt As New DataTable("MyDTBL") dt.Columns.Add("Fname") Dr = Dir("c:\*.*") Do Until Len(Dr) = 0 Wr = dt.NewRow() Wr.Item(0) = Dr dt.Rows.Add(Wr) Idx += 1 Dr = Dir() Loop myDataGridView.DataSource = dt myDataGridView.Columns(0).Name = "ファイル名" _____________________________ こんな感じですね。 ●ListBOX まず ListBox を フォームに名前を MYListBoxを作成してください。 ListBOX の場合はあらかじめ DataSet を定義し、そのDataSet 内に DataTable を作成します。 あとはさきのコードと同じようにDATATABLE にファイル名を ADD してファイル名データリストを作成します。 これを ListBox の DataSource に割り当てるだけです。 サンプルは バックナンバー:VB.NETデータベースプログラミング http://park5.wakwak.com/~weblab/mailMagazine/mag007.html にかかれています。 ____________________________ Dim myDS As New DataSet("myDataSET") myDS.Tables.Add(dt) myListBox.DataSource = myDS.Tables("MyDTBL") myListBox.DisplayMember = "Fname" ____________________________________________________ ★ファイル名の取得方法ですが 検索すればたくさんでてきます。 参考(勝手ながらりんくさせていただきました) ・フォルダ以下のファイルを最下層まで検索または取得する http://jeanne.wankuma.com/tips/vb.net/directory/getfilesmostdeep.html あとはどう料理するかです。 ファイル名だけ取得するには My.Computer.FileSystem.GetName などがつかえそうです。 どうしても datagridview でないとだめなのかな TreeView のほうが便利ですよ。 この手は探せばフリーソースがあるように思えるのですが・・・  

new_hope
質問者

お礼

度々すみません<(_ _)> 上のNo.2に書いた補足の続きです。どうも頭がごちゃごちゃしておりまして(笑)、補足のつもりが違う質問をしてしまったようです。 ファイル名一覧を取得して配列に入れるのに関しては、この操作で実現できました。 ______________________________ 'ファイルの数を取得 Dim fileCount As Integer = System.IO.Directory.GetFiles(csvDir, "2*.csv").Length 'ファイル一覧を入れる配列を宣言(ファイルの数に従って、長さを決める) Dim csvAr(fileCount - 1) As String 'ファイル名を一つ一つ取得し、配列に入れていく Dim i As Integer = 0 For Each stFilePath As String In System.IO.Directory.GetFiles(csvDir, "2*.csv") csvAr(i) = stFilePath.Replace(csvDir, "") i += 1 Next stFilePath '配列内で拡張子を削ったり、文字列を操作したり、適当な処理を行った後 'ListBoxに表示する myListBox.Items.AddRange(csvAr) ______________________________ 「System.IO.Directory.GetFiles(csvDir, "2*.csv")」 これはそのまま配列として扱えるとは知りませんでした。 今度はそのCSVファイル一つ一つの内容を配列にいれるところで躓いております。検索しても、やはりDataTableというのが出てきて、配列しか理解していない僕にはまだ難しいようで・・・。 別に質問させて頂いたほうがよさそうなのですが、もしヒントを頂けるようでしたらNo.2の補足に書いた内容についてもご教授いただけるとたすかります。 お教え頂いたメールマガジンの過去記事も参考になりそうで、助かりました。これからじっくり読んでみます。どうもありがとうございました<(_ _)>