DOBON.NET DOBON.NETプログラミング掲示板過去ログ

NO TITLE

  • 題名: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/27 18:54:52
  • ID: 1165
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
分類:[.NET]

OS : XP VB.net

現在初めてVBにて開発を行っております。
初歩的な質問になってしまいますが、Datagridの扱い方がよくわかりません。
いろいろなサイトを参考にさせて頂いたのですが、いまひとつイメージがわきません。

処理としては、Cドライブ上のテキストファイルを読み込んで、Datagrid上にて編集しようと思っております。
これについて関連のあると思われる項目『Datagrid・Dataset・Datatable・Dataview』の関連がいまいちわかりません。

どのたか、教えて頂く、もしくは参考サイト等を教えて頂けませんでしょうか?
  • 題名: Re[1]: NO TITLE
  • 著者: やまごろ
  • 日時: 2003/10/27 19:13:45
  • ID: 1167
  • この記事の返信元:
    • [1165] NO TITLE カナぶん 2003/10/27 18:54:52
  • この記事への返信:
  • ツリーを表示
以下の1〜4を最低でも1年間繰り返した後、5に移るかを検討してみてください。
ちなみに私は1〜4を5年以上繰り返していますが、未だに5に移れずに居ます。

1.キーワードで検索エンジンに聞く
2.ヘルプを熟読した結果の不明点を掲示板で質問する
3.ダメ元で自分で組んでみた結果の不明点を掲示板で質問する
4.本屋へ行く
5.プログラマに向いてないので辞める

P.S.
私の経験としては、DBMSと繋ぐのがDBコントロールで、データを見せる為にDBコントロールと繋ぐのがグリッドなりスプレッドシートだという感触を得てます。
ていうか、使い方さえ知ってれば良い、ってのがそいつらの利点だと思うんだがなぁ・・・。
  • 題名: Re[2]: NO TITLE
  • 著者: fuku
  • 日時: 2003/10/28 8:20:17
  • ID: 1173
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No1167に返信(やまごろさんの記事)
> 以下の1〜4を最低でも1年間繰り返した後、5に移るかを検討してみてください。
> ちなみに私は1〜4を5年以上繰り返していますが、未だに5に移れずに居ます。
>
> 1.キーワードで検索エンジンに聞く
> 2.ヘルプを熟読した結果の不明点を掲示板で質問する
> 3.ダメ元で自分で組んでみた結果の不明点を掲示板で質問する
> 4.本屋へ行く
> 5.プログラマに向いてないので辞める
>
> P.S.
> 私の経験としては、DBMSと繋ぐのがDBコントロールで、データを見せる為にDBコントロールと繋ぐのがグリッドなりスプレッドシートだという感触を得てます。
> ていうか、使い方さえ知ってれば良い、ってのがそいつらの利点だと思うんだがなぁ・・・。

↑なかなか手厳しいですね。
> 私の経験としては、DBMSと繋ぐのがDBコントロールで、データを見せる為にDBコントロールと繋ぐのがグリッドなりスプレッドシートだという感触を得てます。
↑データベースがなければ自分で作ればいいだけの話だと自分は思います。

まず、テキストファイルをDataGridへ表示する方法ですが、簡単にはいきません。
必要なキーワードとしては、
●StreamReader:テキストファイルを読み込みます。
→ .NET FrameWork 開発者ガイドの「StreamReader コンストラクタ (String, Encoding, Boolean, Int32) 」を参照
 補足:ReadLineメソッドとPeekメソッド

●DataTable:今回データベースを使用しないのでテキストファイルを元にテーブルをメモリ上に作成します。 
→ .NET FrameWork 開発者ガイドの「DataTable の作成と使用」を参照
 補足:DataColumnクラス、DataRowクラス
●DataSet:DataTableの保持用でDataGridとの連結用
●DatGrid:まさに表示、編集用
●DataViewとDataRowViewとStreamWriter:DataGridでの編集結果をテキスト
 ファイルへ反映させる場合に使用 ・・・ 先ずは表示ができてからかな。

手順:
1:DataTableにDataColumnを使用し列を作成します。
  テキストファイルの形式によりますが、カンマ区切りだとその区切りに
  対応する形式で作成し、テキストファイルの1行が区切りなしだと
  テーブル内の列は1列でOK
2:StreamReaderでテキストファイルを1行づつ読み込みDataTableへ
  DataRowを使用し行を作成

3:DataSetへDataTableを設定

4:DataGridとDataSetを連結

以上
  • 題名: Re[3]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/29 1:30:28
  • ID: 1184
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
> ↑なかなか手厳しいですね。
>>私の経験としては、DBMSと繋ぐのがDBコントロールで、データを見せる為にDBコントロールと繋ぐのがグリッドなりスプレッドシートだという感触を得てます。
> ↑データベースがなければ自分で作ればいいだけの話だと自分は思います。
>
> まず、テキストファイルをDataGridへ表示する方法ですが、簡単にはいきません。
> 必要なキーワードとしては、
> ●StreamReader:テキストファイルを読み込みます。
> → .NET FrameWork 開発者ガイドの「StreamReader コンストラクタ (String, Encoding, Boolean, Int32) 」を参照
>  補足:ReadLineメソッドとPeekメソッド
>
> ●DataTable:今回データベースを使用しないのでテキストファイルを元にテーブルをメモリ上に作成します。 
> → .NET FrameWork 開発者ガイドの「DataTable の作成と使用」を参照
>  補足:DataColumnクラス、DataRowクラス
> ●DataSet:DataTableの保持用でDataGridとの連結用
> ●DatGrid:まさに表示、編集用
> ●DataViewとDataRowViewとStreamWriter:DataGridでの編集結果をテキスト
>  ファイルへ反映させる場合に使用 ・・・ 先ずは表示ができてからかな。
>
> 手順:
> 1:DataTableにDataColumnを使用し列を作成します。
>   テキストファイルの形式によりますが、カンマ区切りだとその区切りに
>   対応する形式で作成し、テキストファイルの1行が区切りなしだと
>   テーブル内の列は1列でOK
> 2:StreamReaderでテキストファイルを1行づつ読み込みDataTableへ
>   DataRowを使用し行を作成
>
> 3:DataSetへDataTableを設定
>
> 4:DataGridとDataSetを連結
>
> 以上
>
> お答えありがとう御座います。

実際にヘルプを参考にしながらさせて頂いたのですが、
テキストファイルを一行ずつ読み込む際のカンマ区切りで格行に表示させるのが
方法が思いつかず、一行読み込んでSUBSTRING命令しかわかりません。

何かそれなりのコマンドがあるのでしょうか?
>
>
  • 題名: Re[4]: NO TITLE
  • 著者: fuku
  • 日時: 2003/10/29 8:03:07
  • ID: 1185
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
>
> 実際にヘルプを参考にしながらさせて頂いたのですが、
> テキストファイルを一行ずつ読み込む際のカンマ区切りで格行に表示させるのが
> 方法が思いつかず、一行読み込んでSUBSTRING命令しかわかりません。
>
> 何かそれなりのコマンドがあるのでしょうか?

Splitで配列を作れば簡単ですよ。
例:
Dim strParm as string = "ABC,DEF,HIJ"
Dim strParms() as string

strParms = strParm.Split(",")
実行後は、
strParms(0)がABC、strParms(1)がDEF、strParms(2)がHIJとなります。
ちなみに配列をくっつけるのはJoinです。

以上
  • 題名: Re[5]: NO TITLE
  • 著者: やまごろ
  • 日時: 2003/10/29 13:52:00
  • ID: 1190
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
■No1190に返信(やまごろさんの記事)
> VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
>

fukuです。
ISAMを使う場合は、データベースが必要ですよね?
テキストOnlyの場合は、対象にならないと思います。
  • 題名: Re[7]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/29 18:19:30
  • ID: 1203
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No1192に返信(fukuさんの記事)
> ■No1190に返信(やまごろさんの記事)
>>VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
>>
>
> fukuです。
> ISAMを使う場合は、データベースが必要ですよね?
> テキストOnlyの場合は、対象にならないと思います。
>
いろいろと教えて頂いて今日一日試行錯誤してみたのですが、テキストファイルは全件読み込んで件数はカウントできているのですが、Datagridには表示されません。

参考になるかわかりませんが、こんな感じで書いてみました。

Private Sub Read_F()
On Error Resume Next

Dim t_File As System.IO.StreamReader = System.IO.File.OpenText("C:****\****\****.txt")
Dim F_data As String
cnt = Nothing '件数カウンタ

Dim pkCol As DataColumn
Dim dtview As DataView

'データセットにテーブルを追加する
dtTable = dtSet.Tables.Add("t_顧客")

dtTable.Columns.Add("aaa", Type.GetType("System.String"))
pkCol = dtTable.Columns.Add("bbb",Type.GetType"System.String"))
dtTable.Columns.Add("ccc", Type.GetType("System.Int32"))
dtTable.Columns.Add("ddd", Type.GetType("System.Int32"))
dtTable.Columns.Add("eee", Type.GetType("System.String"))
dtTable.PrimaryKey = New DataColumn() {pkCol}

'テーブルにレコードを追加する。
t_File.BaseStream.Seek(0, System.IO.SeekOrigin.Begin)
Do Until t_File.Peek = -1
F_data = t_File.ReadLine()
Console.WriteLine(F_data)

data1 = F_data.Substring(0, 9) 'aaa
data2 = F_data.Substring(10, 8) 'bbb
data3 = F_data.Substring(19, 1) 'ccc
data4 = F_data.Substring(21, 8) 'ddd
data5 = F_data.Substring(31, 1) 'eee

dtTable.Rows.Add(New Object() {data1, data2, data3, data4, data5})

cnt = cnt + 1 '件数カウンタ

Loop

dtview = New DataView(dtSet.Tables("t_顧客"))
dtview.AllowNew = False
DataGrid1.DataSource = dtview

t_File.Close()

End Sub
  • 題名: Re[8]: NO TITLE
  • 著者: fuku
  • 日時: 2003/10/29 19:49:03
  • ID: 1209
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
これでどうっすか!

    Private Sub Read_F()
        On Error Resume Next

        Dim t_File As System.IO.StreamReader = System.IO.File.OpenText("C:\projects\Sample\BBS\CSV\test.txt")
        Dim F_data As String
        Dim F_datas() As String
        Dim intCnt As Integer
        Dim pkCol As DataColumn
        Dim dtTable As DataTable
        Dim dtview As DataView
        Dim dtRow As DataRow

        dtTable = New DataTable

        pkCol = dtTable.Columns.Add("aaa", Type.GetType("System.String"))
        dtTable.Columns.Add("bbb", Type.GetType("System.String"))
        dtTable.Columns.Add("ccc", Type.GetType("System.Int32"))
        dtTable.Columns.Add("ddd", Type.GetType("System.Int32"))
        dtTable.Columns.Add("eee", Type.GetType("System.String"))
        dtTable.PrimaryKey = New DataColumn() {pkCol}

        'テーブルにレコードを追加する。
        Do While t_File.Peek() >= 0
            F_data = t_File.ReadLine()
            F_datas = F_data.Split(",")
            dtRow = dtTable.NewRow
            dtRow(0) = F_datas(0)
            dtRow(1) = F_datas(1)
            dtRow(2) = F_datas(2)
            dtRow(3) = F_datas(3)
            dtRow(4) = F_datas(4)
            dtTable.Rows.Add(dtRow)
        Loop
        dtview = dtTable.DefaultView
        intCnt = dtview.Count
        dtview.AllowNew = False
        DataGrid1.DataSource = dtview

        t_File.Close()

    End Sub
  • 題名: Re[9]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/29 20:18:39
  • ID: 1210
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No1209に返信(fukuさんの記事)
>
> これでどうっすか!
>
> Private Sub Read_F()
> On Error Resume Next
>
> Dim t_File As System.IO.StreamReader = System.IO.File.OpenText("C:\projects\Sample\BBS\CSV\test.txt")
> Dim F_data As String
> Dim F_datas() As String
> Dim intCnt As Integer
> Dim pkCol As DataColumn
> Dim dtTable As DataTable
> Dim dtview As DataView
> Dim dtRow As DataRow
>
> dtTable = New DataTable
>
> pkCol = dtTable.Columns.Add("aaa", Type.GetType("System.String"))
> dtTable.Columns.Add("bbb", Type.GetType("System.String"))
> dtTable.Columns.Add("ccc", Type.GetType("System.Int32"))
> dtTable.Columns.Add("ddd", Type.GetType("System.Int32"))
> dtTable.Columns.Add("eee", Type.GetType("System.String"))
> dtTable.PrimaryKey = New DataColumn() {pkCol}
>
> 'テーブルにレコードを追加する。
> Do While t_File.Peek() >= 0
> F_data = t_File.ReadLine()
> F_datas = F_data.Split(",")
> dtRow = dtTable.NewRow
> dtRow(0) = F_datas(0)
> dtRow(1) = F_datas(1)
> dtRow(2) = F_datas(2)
> dtRow(3) = F_datas(3)
> dtRow(4) = F_datas(4)
> dtTable.Rows.Add(dtRow)
> Loop
> dtview = dtTable.DefaultView
> intCnt = dtview.Count
> dtview.AllowNew = False
> DataGrid1.DataSource = dtview
>
> t_File.Close()
>
> End Sub

こんな見にくいPGMに付き合って頂いて本当鬼有り難う御座います。
お恥ずかしい事ながらこれだけ教えて頂いてもまだ表示されません。
DATAGRIDの左端の行見出し?という様な所でけが、増えてデータは何も表示されません。。。

Private Sub Read_F()
On Error Resume Next

Dim t_File As System.IO.StreamReader = System.IO.File.OpenText("C:\***\****\*****.txt")
Dim F_data As String
Dim F_datas() As String
Dim intCnt As Integer
Dim pkCol As DataColumn
Dim dtTable As DataTable
Dim dtview As DataView
Dim dtRow As DataRow

'データセットにテーブルを追加する
dtTable = New DataTable

dtTable.Columns.Add("aaa", Type.GetType("System.String"))
pkCol = dtTable.Columns.Add("bbb", Type.GetType("System.String"))
dtTable.Columns.Add("ccc", Type.GetType("System.Int32"))
dtTable.Columns.Add("ddd", Type.GetType("System.Int32"))
dtTable.Columns.Add("eee", Type.GetType("System.String"))
dtTable.PrimaryKey = New DataColumn() {pkCol}

'テーブルにレコードを追加する。
Do While t_File.Peek >= 0
F_data = t_File.ReadLine()
F_datas = F_data.Split(",")
dtRow = dtTable.NewRow
dtRow(0) = F_datas(0)
dtRow(1) = F_datas(1)
dtRow(2) = F_datas(2)
dtRow(3) = F_datas(3)
dtRow(4) = F_datas(4)
dtTable.Rows.Add(dtRow)
Loop

dtview = dtTable.DefaultView
intCnt = dtview.Count
dtview.AllowNew = False
DataGrid1.DataSource = dtview

End Sub
  • 題名: Re[10]: NO TITLE
  • 著者: fuku
  • 日時: 2003/10/29 20:37:12
  • ID: 1211
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
> こんな見にくいPGMに付き合って頂いて本当鬼有り難う御座います。
> お恥ずかしい事ながらこれだけ教えて頂いてもまだ表示されません。
> DATAGRIDの左端の行見出し?という様な所でけが、増えてデータは何も表示されません。。。

先ず、dtTableにきちんとテキストの内容が読み込まれているか
intCnt = dtview.Countのところでブレークでとめて
dtviewオブジェクトの中身をウォッチ等を使用し確認したほうが
よさそうですね。
自分の環境では動作しますので、テキストファイルの内容の問題かも
しれませんね。
ちなみに自分の試験したテキストファイルの内容は以下です。
aaa,bbb,1,2,eee
fff,ggg,3,4,jjj

やはり、今後のことを考えると1Stepづつ実行し、
オブジェクトの内容を確認し自身で問題を発見する努力も必要かと!
  • 題名: Re[11]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/29 20:41:55
  • ID: 1212
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
> 先ず、dtTableにきちんとテキストの内容が読み込まれているか
> intCnt = dtview.Countのところでブレークでとめて
> dtviewオブジェクトの中身をウォッチ等を使用し確認したほうが
> よさそうですね。
> 自分の環境では動作しますので、テキストファイルの内容の問題かも
> しれませんね。
> ちなみに自分の試験したテキストファイルの内容は以下です。
> aaa,bbb,1,2,eee
> fff,ggg,3,4,jjj
>
> やはり、今後のことを考えると1Stepづつ実行し、
> オブジェクトの内容を確認し自身で問題を発見する努力も必要かと!
>

失礼致しました。
頼りすぎていました。
ここまで親切に相談にのって頂きまして本当に有り難う御座いましたm(_ _)m
  • 題名: Re[12]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/30 0:57:30
  • ID: 1215
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
無事解決いたしました。
下記の通り作成してみた処、表示されました。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

On Error Resume Next

Dim t_file As System.IO.StreamReader = System.IO.File.OpenText("C:\**\***\****.txt")
Dim F_data As String
Dim F_datas() As String
Dim intCnt As Integer
Dim pkCol As DataColumn
Dim dtTable As DataTable
Dim dtview As DataView
Dim dtRow As DataRow

'データセットにテーブルを追加する
dtTable = dtSet.Tables.Add("t_顧客")

'テーブルにフィールドを追加する
dtTable.Columns.Add("aaa",Type.GetType"System.String"))
pkCol = dtTable.Columns.Add("bbb.", Type.GetType("System.String"))
dtTable.Columns.Add("ccc", Type.GetType("System.String"))
dtTable.Columns.Add("ddd", Type.GetType("System.String"))
dtTable.Columns.Add("eee", Type.GetType("System.String"))
dtTable.PrimaryKey = New DataColumn() {pkCol}

'テーブルにレコードを追加する。
Do While t_file.Peek() >= 0
F_data = t_file.ReadLine()
F_datas = F_data.Split(",")
dtRow = dtTable.NewRow
dtRow(0) = F_datas(0)
dtRow(1) = F_datas(1)
dtRow(2) = F_datas(2)
dtRow(3) = F_datas(3)
dtRow(4) = F_datas(4)
dtTable.Rows.Add(dtRow)
Loop
dtview = New DataView(dtSet.Tables("t_顧客"))
intCnt = dtview.Count
dtview.AllowNew = False
DataGrid1.DataSource = dtview

t_file.Close()

End Sub

fukuさんどうも有難うございました。
解決済み!
■No1192に返信(fukuさんの記事)
> ■No1190に返信(やまごろさんの記事)
>>VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
>>
>
> fukuです。
> ISAMを使う場合は、データベースが必要ですよね?
> テキストOnlyの場合は、対象にならないと思います。

「CSVに対してSQLが使える」と書いてあろうが!よく読みなさい!
  • 題名: Re[8]: NO TITLE
  • 著者: カナぶん
  • 日時: 2003/10/30 13:09:42
  • ID: 1226
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No1225に返信(やまごろさんの記事)
> ■No1192に返信(fukuさんの記事)
>>■No1190に返信(やまごろさんの記事)
> >>VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
> >>
>>
>>fukuです。
>>ISAMを使う場合は、データベースが必要ですよね?
>>テキストOnlyの場合は、対象にならないと思います。
>
> 「CSVに対してSQLが使える」と書いてあろうが!よく読みなさい!

どういう事ですか?
  • 題名: Re[8]: NO TITLE
  • 著者: fuku
  • 日時: 2003/10/30 13:10:53
  • ID: 1227
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No1225に返信(やまごろさんの記事)
> ■No1192に返信(fukuさんの記事)
>>■No1190に返信(やまごろさんの記事)
> >>VB6だと簡単にデータコントロール+グリッドでJETのISAMドライバ使ってSCEMA.INIとセットでCSVに対してSQLが使えるんだが(0から作ってレコードセット得るまでの所要時間30分程度)、.NETは大変なのねぇ・・・。
> >>
>>
>>fukuです。
>>ISAMを使う場合は、データベースが必要ですよね?
>>テキストOnlyの場合は、対象にならないと思います。
>
> 「CSVに対してSQLが使える」と書いてあろうが!よく読みなさい!

fukuです、
やまごろさん失礼しました。
VB6のDataGrid.Database.TableDefsとTableDefの組み合わせで
確かに簡単にできました(自分の場合は90分ほどかかりましたが)。
勉強不足でしたm(_"_)m

DOBON.NET | プログラミング道 | プログラミング掲示板