- PR -

DataGrid使用時にエラーが出てしまいます

1
投稿者投稿内容
みかん
常連さん
会議室デビュー日: 2003/12/13
投稿数: 42
投稿日時: 2006-03-18 14:09
VS2003のVBを利用しています。
変数に格納されたデータ(下記※1に記載)を
DataGridに表示したいのですが下記のようなエラーが出てしまい
原因が分かりません。どなたかご教授お願い致します。
因みにデバッグ時には Rs.Collect("番号") = DataS(34) のところで
とまっていました。

エラー内容
'System.IndexOutOfRangeException' のハンドルされていない
例外が DataGridTest031801.exe で発生しました。
追加情報 : インデックスが配列の境界外です。


※1.変数内容:文字間は半角スペースとなっています。
A A1 2
B B2 0
C C3 5
D D4 4
E E5 1
F F6 0
G G7 0
H H8 0
I I9 1
J J10 13

一応、コードを記載いたします。現状では、参照に「adodb」を追加した後に
以下の※2ように記述していますがDataGridを使用する場合、他に何か設定する必要が
あるのでしょうか。

※2:
Public Class Form1
Inherits System.Windows.Forms.Form
Private WithEvents RS As ADODB.Recordset
(省略)
Private Sub Button1_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button1.Click
Dim Rs As ADODB.Recordset
Dim Strm As ADODB.Stream
Dim StrmPath As String
    StrmPath="c:\test.txt"
Rs = New ADODB.Recordset
Rs.Fields.Append("番号", ADODB.DataTypeEnum.adVarChar,1)
Rs.Fields.Append("形式名", ADODB.DataTypeEnum.adVarChar,15)
Rs.Fields.Append("累計", ADODB.DataTypeEnum.adVarChar,16)
Rs.Open
Strm = New ADODB.Stream
Strm.Type = ADODB.StreamTypeEnum.adTypeText
Strm.LoadFromFile(StrmPath)
Dim DataS() As String
Do Until Strm.EOS
Rs.AddNew()
DataS = Split(Strm.ReadText,,-1)
Rs.Collect("番号") = DataS(1)
Rs.Collect("形式名") = DataS(15)
Rs.Collect("累計") = DataS(16)
Rs.Update()
Loop
Strm.Close()
Strm = Nothing
DataGrid1.CaptionText = "詳細"
Rs.MoveFirst()
DataGrid1.DataSource = Rs
DataGrid1.Refresh()
End Sub
みかん
常連さん
会議室デビュー日: 2003/12/13
投稿数: 42
投稿日時: 2006-03-18 14:13
すみません。
変数内容のところで半角スペースが省略されてしまいました。実際には
最初の半角スペースは、32個あります。その隣の半角スペースは、18個あります。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-03-18 16:25
DataSource は ICollection インターフェイスを
実装しているクラスのインスタンスで無ければいけなかったような・・・

ADODBを使い続けたいなら、検索結果を DataTabe などに
一度格納した後に DataSource に割り当てる必要があると思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-18 21:05
 とりあえず例外は、配列が34個もないのに34個目のアイテムにアクセスしようとしているから発生しています。DataS.Length プロパティを見て、何個目までアクセスできるか、確認してください。
 VB6 以前と違い、VB.NET では0起算で、個数 -1 までアクセスできます。
Dim foo(30) As Object
だと、インデックスは0〜29


 ADODB を参照したり、レコードセットを作成する必要性を感じられません。データクラスとコレクションを定義するとか、DataTable で対応可能だと思います。
Dim Rs As New DataTable
Rs.Columns.Add("番号", ...
...
Dim row As DataTow = Rs.NewRow
row("番号") = DataS(1)


 String.Split メソッドを使いましょう。「文字」は c です。
" " ← 空白1つの文字列
" "c ← 空白1つの文字
New Char() {" "c} ← 1つの空白文字からなる1次元の配列

〆 written by Jitta@わんくま同盟 on 2006/03/18
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
みかん
常連さん
会議室デビュー日: 2003/12/13
投稿数: 42
投稿日時: 2006-03-18 23:59
かるあ様、Jitta様
早速のご回答有難うございます。
ADODBは、Dim Rs As Recordset と記述したときに
たまたま、出てきたので使用してしまいました。
データクラス、コレクション、DataTableについて
もっとよく調べてみます。
それと、DataTable、Splitの使用例をご教授いただき有難うございます。
この度の回答をもとに修正を進めて行きたいと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-19 11:17
引用:

Jittaさんの書き込み (2006-03-18 21:05) より:

VB6 以前と違い、VB.NET では0起算で、個数 -1 までアクセスできます。
Dim foo(30) As Object
だと、インデックスは0〜29


VB は、"今でも" 宣言時 / 初期化時に指定する要素の意味合いは変わってません。
この場合は、0 〜 30 の 31 要素確保されていることになります。
0 〜 29 になるのは VB ではなく、それ以外の言語ですね。

それと前半部分は「昔のコレクション」と「配列」を混同しているように思えます。
これも昔の "一部分" の特徴が "全体" がそうであったと誤解させている例の典型ですね。
少し前にも似たような誤解があったので、とりあえず参考リンクです。

  配列宣言の悩み(Cプログラマの)

まあ、私も VB は詳しくないのでえらそうなことは言えませんが... (;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)