- - PR -
[VB.NET]グリッドの行を削除するとエラーになる
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-09-21 13:44
また皆様の知恵をお借りしたいと思いまして投稿させていただきます
現在Windowsアプリを作成しております。 フォーム上にはリストボックスと追加ボタン、削除ボタン、データグリッドがあります。 リストボックス内の項目を選択し追加を押下するとデータグリッドに表示し 選択されたリストボックスの内容を削除します。 データグリッド選択時に削除ボタンを押下すると、逆にデータグリッドの選択行を削除し またリストボックスに削除された内容を表示します。 追加も削除を動きとしてできています。 しかし問題があります。 データグリッドに反映された内容が1行のみの場合、削除を行うと いきなりエラ−で「インデックスが配列の境界外です」となり落ちてしまいます。 データグリッドの中身はテーブルとリンクはしていませんが、 仮想テーブルという形でコードの中でデータテーブルを生成しています。 グリッドの中身が1行の場合に削除を行う方法で何かいい手はありますでしょうか? | ||||
|
投稿日時: 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-09-21 14:11
連続で失礼します。
単体のフォーム一個だけなら動作には何も問題はありません。 実際はこのフォームがMDIフォームの子にあたります。 親子の関係のあるフォームで行うと最初に記述したエラーで落ちます。 | ||||
|
投稿日時: 2004-09-21 15:48
こんにちは。 インデックスが配列の境界外にならないようにすればいいのではないでしょうか? 『インデックス』がどうような値か確認されましたか? コードはちゃんと見てませんが、これを確認する事によっておのずと対処方法がわかるのではないでしょうか? | ||||
|
投稿日時: 2004-09-21 18:24
>とっとさん
ブレイクポイントで止めてデバッグしてると高確率で起きたりします。 いまだ原因は不明なのですが(それらしきインデックスのあたりは全部回避してます) コーディングの仕方がまずいのかもしれないので、 もう一度組みなおしてみます。 ありがとうございました。 | ||||
|
投稿日時: 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-09-24 20:28
削除する直前に
Grid1.DataSource = Nothing 削除後に Grid1.DataSource = dt としてみてはどうでしょう? |
1