• 締切済み

ファイルの一覧を取得して配列に入れるには(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の補足に書いた内容についてもご教授いただけるとたすかります。 お教え頂いたメールマガジンの過去記事も参考になりそうで、助かりました。これからじっくり読んでみます。どうもありがとうございました<(_ _)>

関連するQ&A

  • VB ファイル一覧表示について

    VB初心者です。 現在、指定したフォルダのサブフォルダを含むファイル名一覧を表示したものを作りたいと思い、試行錯誤しております。 ファイル名は、指定したフォルダ以下のパスで表示したものを作りたいと思っているのですが、どうしてもフルパスで表示されてしまいます。 現在、自分が書いているプログラムに拘ろうと思っていませんので、どなたかフルパスではないファイル名一覧表示方法を教えていただけないでしょうか。 環境は、Windows XP 、Microsoft Visual Studio 2008 Express Editionです。 ファイル名一覧表示は、ListViewかListBoxで考えています。 よろしくお願いいたします。

  • VB2005のデータグリッドビューとデータテーブルについて

    いつもお世話になっています。 独学でVBの勉強をしているのですが、 どうしてもわからないことがあるので教えて下さい。 現在行なおうとしていることは、 mdbからデータテーブルにレコードを取得して、 それをデータグリッドビューに設定し、 値の一部をコードで変更するということです。 DataGridView1.DataSource = DataTable1 とすれば、データテーブルのデータを データグリッドビューにて表示させることができるのですが、 コードでデータグリッドビューの値を変更すると、 データテーブルの値も一緒に変更されてしまうんです。 DataGridView1.DataSource = DataTable1.Clone とすると、今度はレコードが表示されなくなってしまって・・・ 何か良い方法がありましたら、教えて下さい。 よろしくお願いします。

  • VB.NETで、配列をテーブルに変換して表示する。

    VB.NET初心者です 一次元配列string()に、下記データが格納されており、 そのデータを、ListBox1に表示したいのですが、 そのまま表示する方法が不明な為、DataTableに変換して から表示する方法で、実行しましたが、 syaintable = CType(syaindata_Obj(i), DataTable)の部分で、 「型 'System.String' のオブジェクトを型 'System.Data.DataTable' にキャストできません。」 というエラーが発生してしまいます。 列1 列2 列3 1 社員A 営業 2 社員B 総務 3 社員C 開発 4 社員D 開発 5 社員E 営業 6 社員F 営業 7 社員G 総務 8 社員H 営業 9 社員I  営業 10 社員J 開発 Dim syaindata As String() Dim syaindata_Obj As Object Dim syaintable As New DataTable Dim cnt As Integer Dim i As Integer i = 0 cnt = syaindata.Length syaindata_Obj = CObj(syaindata) For i = 0 To cnt - 1 syaintable = CType(syaindata_Obj(i), DataTable) Next ListBox1.DataSource = syaintable 以上、この方法以外でも良いので、リストボックスに表示 するようにしたいと思います。 宜しくお願い致します。

  • VB.NETの配列について教えてください

    内容を削除する際に、リストボックスで使う ListBox1.Items.RemoveAt(n) と同じことを配列で行いたいのですが、 可能であれば方法を教えて頂けないでしょうか。 よろしくお願い致します。

  • 取得した配列のつかいかた

    できること。 「下記コードで、配列に消したいファイルのパスを入れています。」 やりたいこと。 「配列を使ってファイルを削除したい。」 わからないこと。 「(1)、comannd2を使った時の処理の仕方。  (2)、それの実行方法。」です。 すみませんが、ご意見下さい。 足りない情報はつっっこんでください。 よろしくお願いします。 <?php $command1="find /smbmount/IDFO/ ! -regex '/smbmount/1254/01/.*/01H/H06/.*' -type -f ";//残すリスト作って「!」をつけて消すリストの表示 $command2=rm -i $output;//ここがわからない $output=array( );//配列に入れて表示 $ret=null;// exec ( $command1, $output, $ret );//execの実行 exec ( $command2);//実行方法わからない print_r($output);//表示 ?>

    • ベストアンサー
    • PHP
  • DataGridViewで再表示すると変更不可にならない

    Visual Basic 2008 にて開発していますがDataGridViewについて質問させて下さい。 DataGridViewのデータ表示は、検索結果をDataTableに格納し、 そのDataTableをDataSourceに設定する方法で行っています。 DataGridView内にはチェックボックスがあり、 そのチェックボックスは条件によってReadOnly = Trueにて変更不可にして表示しています。 最初の表示は問題なく条件に合えば ReadOnly = Trueにて変更不可になり表示してくれますが、 再表示(DataTableをDataSourceに再代入)すると条件に合っているのにReadOnly = Trueが効かず、 チェックボックスが変更可能となって表示してしまいます。 ReadOnly=True にする方法は、DataGridView の件数を取得し、 jjCnt = 0 Do Until jjCnt >= ggCnt   If DataGridView1.Rows(jjCnt).Cells(88).Value.ToString() = "1" Then DataGridView1.Rows(jjCnt).Cells(0).ReadOnly = True End If jjCnt = jjCnt + 1 Loop で行っています。 何故、再表示だと変更不可にならないのか解らずご教授願いたく宜しくお願い致します。

  • VBA フォルダ内のファイルを、ファイル名順に開く

    【PPT VBA】フォルダ内のファイルを、ファイル名順に開く方法について  今晩は、質問させていただきます。どうぞよろしくお願いいたします。  環境:Win7+PPT2007 になります。  下記のようなコードで、あるフォルダ内のファイル群のデータを取得しております。 「ファイル名順」でデータを取り出したいのですが、違う順(おそらく日時順)で 出てくるので悩んでいる次第でございます。  検索いたしておりますと、ハードディスク等の環境によって検出順が異なるようでございましたが 何か、良さそうな方法がございましたらお教えいただきたくお願いいたします。 Dim File_Collection As Object Dim File_List As Variant Dim Folder_Collection As Object Dim Folder_List As Variant Set File_Collection = CreateObject("Scripting.FileSystemObject") _ .GetFolder(パス).Files For Each File_List In File_Collection      '(名前順では検出してくれません。。。) Next  暫く考えまして、例えば Stringの配列を用意しておいて一旦、上記コードでファイル名とパスをリスト化 →配列の文字列を登り順に、Sort →これの順にファイルを開いていく などという事を思いつきました。しかしファイル数が多いため(100~500個でございます)、 これらの長いパスを配列に入れるというのも、メモリに負担がかかる(?)のかな などと考えている次第でございます。  他に、配列の代わりにエクセルを一旦開いて、そこでソート・・・・・とも考えましたが 友人達に使っていただく可能性があり、余りスマートな解決策ではなさそうですので それよりは上記の「配列でソート」を優先したい次第でございます。  コーディングで何か良い方法があれば良いのでございますが、 他の方法でも結構でございます。もし「自分なら、こうするかな」といった ようなご意見などございましたら是非、ご紹介いただけないでしょうか。  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします。

  • vb.net datagridviewの列位置変更

    vb.net datagridviewの列位置を変更する方法を教えて下さい。 データグリッドビューにDataTable(DBから抽出したデータ)を割り当てました。 DataGridView1.DataSource = DataTable1 ここに、カラムを追加しました Dim column As New DataGridViewButtonColumn() '列の名前を設定 column.Name = "Button" '全てのボタンに"詳細閲覧"と表示する column.UseColumnTextForButtonValue = True column.Text = "詳細閲覧" 'DataGridViewに追加する DataGridView1.Columns.Add(column) この追加したカラムを一番左に表示したいです。

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • エクスプローラ(ファイル一覧の取得)

    エクスプローラであるフォルダの一覧を表示しますが、 そのフォルダに表示(格納)されているファイルの一覧リストが欲しいのですが、 テキストファイルとかに落とせないでしょうか? ご教授願います。

専門家に質問してみよう