- PR -

[VB.NET]グリッドの行を削除するとエラーになる

1
投稿者投稿内容
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-09-21 13:44
また皆様の知恵をお借りしたいと思いまして投稿させていただきます
現在Windowsアプリを作成しております。
フォーム上にはリストボックスと追加ボタン、削除ボタン、データグリッドがあります。

リストボックス内の項目を選択し追加を押下するとデータグリッドに表示し
選択されたリストボックスの内容を削除します。
データグリッド選択時に削除ボタンを押下すると、逆にデータグリッドの選択行を削除し
またリストボックスに削除された内容を表示します。


追加も削除を動きとしてできています。
しかし問題があります。
データグリッドに反映された内容が1行のみの場合、削除を行うと
いきなりエラ−で「インデックスが配列の境界外です」となり落ちてしまいます。

データグリッドの中身はテーブルとリンクはしていませんが、
仮想テーブルという形でコードの中でデータテーブルを生成しています。

グリッドの中身が1行の場合に削除を行う方法で何かいい手はありますでしょうか?

ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-09-21 13:56
実際のコードは以下になります

*********************************************************

Public dt As New DataTable("Table")
Private mintSuq As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Grid設定
GridTableStyle()
With listBox'リストボックスに項目を設定
.Items.Add("ああ")
.Items.Add("いい")
.Items.Add("うう")
End With

End Sub
'*******************************************************************************************
'*******************************************************************************************
Function getSeq() As Integer
mintSuq += 1 '初期値:1
Return mintSuq
End Function
'*******************************************************************************************
'*******************************************************************************************
Function CreatDataTable() As DataTable
Dim dc As DataColumn

dc = dt.Columns.Add("NO", GetType(Integer))
dc.AutoIncrement = True
dc.AutoIncrementSeed = 1
dc.AutoIncrementStep = 1
dt.Columns.Add("項目", GetType(String))
Grid1.DataSource = dt
Return dt
End Function
'*******************************************************************************************
'*******************************************************************************************
Sub GridTableStyle()

Dim tbl1 As DataGridTableStyle = New DataGridTableStyle
CreatDataTable()
tbl1.MappingName = "Table"
tbl1.AllowSorting = False
tbl1.RowHeadersVisible = False
Dim col(1) As DataGridTextBoxColumn

'NO
col(0) = New DataGridTextBoxColumn
col(0).HeaderText = "NO"
col(0).MappingName = "NO"
col(0).Width = 20
col(0).Alignment = HorizontalAlignment.Left
col(0).NullText = ""
'項目
col(1) = New DataGridTextBoxColumn
col(1).HeaderText = "項目"
col(1).MappingName = "項目"
col(1).Width = 100
col(1).Alignment = HorizontalAlignment.Left
col(1).NullText = ""

tbl1.GridColumnStyles.AddRange(col)
Grid1.TableStyles.Clear()
Grid1.TableStyles.Add(tbl1)

End Sub
'*******************************************************************************************
'*******************************************************************************************
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
'リストボックスのカラム選択時
If listBox.SelectedIndex <> -1 Then

'選択したカラムをDataTableに追加・作成
Dim dr As DataRow
dr = dt.NewRow
dr("NO") = getSeq()
dr("項目") = listBox.SelectedItem
dt.Rows.Add(dr)
Load_FLG = 0

'選択したカラムをリストボックスから削除
listBox.Items.RemoveAt(listBox.SelectedIndex)
End If
End Sub

'*******************************************************************************************
'*******************************************************************************************
Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click
Dim cm As CurrencyManager = CType(Me.BindingContext(Grid1.DataSource, Grid1.DataMember), CurrencyManager)
Dim dv As DataView = CType(cm.List, DataView)
Dim dr As DataRow

'gridのレコードID取得
dr = dv.Item(cm.Position).Row
Dim intID As Integer = dr(0).ToString
dv.Sort = "NO"

'レコード検索
Dim intRowIndex As Integer = dv.Find(intID)
If intRowIndex <> -1 Then

'レコードが存在する場合削除を行う
Dim drv As DataRowView = dv(intRowIndex)
Dim strCol1 As String = drv("項目")
listBox.Items.Add(strCol1)

'レコードが存在する場合削除を行う
drv.Delete()

End If
End Sub

End Class
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-09-21 14:11
連続で失礼します。

単体のフォーム一個だけなら動作には何も問題はありません。
実際はこのフォームがMDIフォームの子にあたります。
親子の関係のあるフォームで行うと最初に記述したエラーで落ちます。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-21 15:48
引用:

ちづるさんの書き込み (2004-09-21 13:44) より:

いきなりエラ−で「インデックスが配列の境界外です」となり落ちてしまいます。




こんにちは。

インデックスが配列の境界外にならないようにすればいいのではないでしょうか?

『インデックス』がどうような値か確認されましたか?

コードはちゃんと見てませんが、これを確認する事によっておのずと対処方法がわかるのではないでしょうか?
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-09-21 18:24
>とっとさん
ブレイクポイントで止めてデバッグしてると高確率で起きたりします。

いまだ原因は不明なのですが(それらしきインデックスのあたりは全部回避してます)
コーディングの仕方がまずいのかもしれないので、
もう一度組みなおしてみます。

ありがとうございました。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-21 19:07
こんにちは。

未だにコードは全部見てませんが・・・。

これか

'選択したカラムをリストボックスから削除
listBox.Items.RemoveAt(listBox.SelectedIndex)
End If

これの

レコードが存在する場合削除を行う
Dim drv As DataRowView = dv(intRowIndex)

インデックスじゃないんですか?

引用:
--------------------------------------------------------------------------------


ちづるさんの書き込み (2004-09-21 13:44) より:

いきなりエラ−で「インデックスが配列の境界外です」となり落ちてしまいます。


--------------------------------------------------------------------------------

他人のコードを読むのはしんどいものです。

ポイントを絞って『いきなりエラ−』の周辺のコードのどこでそのエラーが起ったかを詳しく書きましょう。そしたら「インデックスが配列の境界外です」のインデックスがどのインデックスの事か分かるでしょうし、おのずと解決します。

例えばリストボックスで項目を削除してからそのインデックスを参照しているとか、DataGridの場合も同じだと思いますが・・・・。
フジー
常連さん
会議室デビュー日: 2004/06/03
投稿数: 45
投稿日時: 2004-09-24 20:28
削除する直前に
Grid1.DataSource = Nothing

削除後に

Grid1.DataSource = dt

としてみてはどうでしょう?
1

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