- - PR -
DataGrid使用時にエラーが出てしまいます
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2006-03-18 14:13
すみません。
変数内容のところで半角スペースが省略されてしまいました。実際には 最初の半角スペースは、32個あります。その隣の半角スペースは、18個あります。 | ||||
|
投稿日時: 2006-03-18 16:25
DataSource は ICollection インターフェイスを
実装しているクラスのインスタンスで無ければいけなかったような・・・ ADODBを使い続けたいなら、検索結果を DataTabe などに 一度格納した後に DataSource に割り当てる必要があると思います。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2006-03-18 23:59
かるあ様、Jitta様
早速のご回答有難うございます。 ADODBは、Dim Rs As Recordset と記述したときに たまたま、出てきたので使用してしまいました。 データクラス、コレクション、DataTableについて もっとよく調べてみます。 それと、DataTable、Splitの使用例をご教授いただき有難うございます。 この度の回答をもとに修正を進めて行きたいと思います。 | ||||
|
投稿日時: 2006-03-19 11:17
VB は、"今でも" 宣言時 / 初期化時に指定する要素の意味合いは変わってません。 この場合は、0 〜 30 の 31 要素確保されていることになります。 0 〜 29 になるのは VB ではなく、それ以外の言語ですね。 それと前半部分は「昔のコレクション」と「配列」を混同しているように思えます。 これも昔の "一部分" の特徴が "全体" がそうであったと誤解させている例の典型ですね。 少し前にも似たような誤解があったので、とりあえず参考リンクです。 配列宣言の悩み(Cプログラマの) まあ、私も VB は詳しくないのでえらそうなことは言えませんが... (;^-^) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1