- PR -

インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。

1
投稿者投稿内容
はる
会議室デビュー日: 2008/06/21
投稿数: 13
投稿日時: 2008-06-25 23:51
こんばんは。
前回”クリックされたボタンの判断”では大変お世話になりました。

前回同様、VB.NET2005とAccess2003を使用して簡単なソフトを製作しています。

AccessのテーブルにはID、名前、画像、説明を入れています。
VBへ呼び出し、名前・画像・説明文を連結させて表示させています。

レコードを順番に表示していくのではなく、レコードと同じだけのボタンを配置し、
ボタンに対応したレコードを表示できるようにしたいと思っています。
例)”あ”というボタンをクリック→”あ”の画像、説明文を表示


どのボタンが押されるのか分からないので、どのボタンがクリックされたかという判断について質問させていただきました。
そして、できたプログラムを元にAccessからデータを呼び出しを行いたかったのですが、エラーがでてしまいました。
コードとエラーは以下のとおりです。
______________

Imports System.Data.OleDb


Public Class Form1

Dim Cn As New OleDbConnection("接続文字列.mdb")
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim table As New DataTable
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim Row As DataRow
Dim kana(45) As Button
Dim i As Integer
_______

Private Sub Form1_Load(略) Handles MyBase.Load
SQLCm.CommandText = "SELECT * From T_指文字"
Adapter.Fill(table)
    
    kana(0) = Button1
    kana(1) = Button2
:
:
kana(44) = Button45
    kana(45) = Button46

For i = 0 To 45
kana(i).Tag = i
AddHandler kana(i).Click, AddressOf myclick

Next


table.Dispose()
Adapter.Dispose()
SQLCm.Dispose()
Cn.Dispose()


End Sub

___________

  Private Sub myclick(略)
i = DirectCast(DirectCast(sender, Button).Tag, Integer)

★Dim table As DataTable = DirectCast(Label1.DataBindings(0).DataSource, DataTable)

    Dim Bind As BindingManagerBase = Me.BindingContext(table)

Bind.Position = i

Call LoadRecord(Bind.Current.Row)

End Sub
_________


Private Sub LoadRecord(ByVal Row As DataRow)
Dim FileName As String

If IsDBNull(Row("画像")) Then
PictureBox1.Image = Nothing
Return
End If

FileName = Row("画像")

If IO.File.Exists(FileName) Then
PictureBox1.Image = Image.FromFile(FileName)
Else
PictureBox1.Image = Nothing
End If

End Sub
End Class
____________

となっています。エラーは★の列の”(0)”の部分です。

エラー:インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index

というようにでました。()内の数字を変えてみたりしたのですが・・・・
同じエラーメッセージがでてしまいます。
どなたかご存知でしたらご教授ください。よろしくお願いします。
長くなってしまい、申し訳ないです。。。
mitchin
会議室デビュー日: 2003/05/28
投稿数: 16
投稿日時: 2008-06-26 04:16
これは IndexOutOfRangeException って例外です。

この例外が発生している箇所をみると パラメータ index が 0 ですよね。
ってことは DataBindings プロパティに要素(Binding オブジェクト)がないということです。
ちゃんと Label1 にデータ連結していますか?
はる
会議室デビュー日: 2008/06/21
投稿数: 13
投稿日時: 2008-06-26 10:08
mitchinさん、おはようございます!

ご返答ありがとうございます。

エラーの意味がいまいちち理解できなかったので、わかりやすく書いて頂き助かりました。

プログラムを見直したところ、

Label1.DataBindings.Add("Text",table,"名前")

という部分が抜けていました・・・。一番大事な連結部分ですよね。。。。

ここを付け足したところ、labelへの表示も対応した画像もきちんと表示されるようになりました!

貴重なお時間を割いてご返答いただきましてありがとうございました。
1

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