@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

エラー「ListManagerへの位置はrowNumと同じでなければなりません」について

1
投稿者投稿内容
パンダ
会議室デビュー日: 2004/03/22
投稿数: 2
投稿日時: 2004-03-22 14:11
こんにちは。
VB.NET、SQLServer2000を使用して、Windowsアプリケーションを開発しています。


あるDataGrid「DataGrid1」上でデータを編集中に、
「ListManagerへの位置はrowNumと同じでなければなりません」
というエラーが発生します。

Try〜Catchでエラーをキャッチすることが出来ず、
どういった場合・タイミングで発生するのかは特定できておりません。

色々とDataGrid1上で操作をしてみましたが、
DBへの保存(※)後に何らかの操作を行うと発生するようです。

※DBへの保存
'データテーブルTable1の行を削除し、データを再抽出
Me.DataSet1.Table1.Rows.Clear()
Me.DataAdapter1.Fill(Me.DataSet1.Table1)

■使用しているオブジェクト
・DataSet1:型指定されたデータセット
・Table1:DataSet1内のテーブル
・DataAdapter1:Table1用のデータアダプタ
・View1:Table1をテーブルとするビュー
・DataGrid1:View1をデータソースとするデータグリッド
(これらのオブジェクトは、フォームデザイン時に作成・各プロパティを設定しています。)

このエラーが発生する原因、タイミング、及び対応について
ご存知の方がいらっしゃいましたら、
返答の方、よろしくお願い致します。

ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-22 18:50
DBの保存部分なんですがFillした後はどのような処理になっているのでしょうか?

おそらくDataGridの編集行からキー項目を取得してテーブルから該当する
データを検索していると思いますが、そのあたりの処理をコメントアウト
してみてエラーがでなくなるかチェックしてみてはどうでしょうか
パンダ
会議室デビュー日: 2004/03/22
投稿数: 2
投稿日時: 2004-03-22 23:03
ゆうじゅんさん、返答ありがとうございます。

DBの保存部分は、

(1)DataAdapter1.Update --DBデータ更新
(2)Table1.Rows.Clear --既存データ削除
(3)DataAdapter1.Fill(Table1) --DBデータ再抽出

という処理しか実行していないのですが、
色々と試してみたところ、どうやら
上記(2)(3)のタイミングでCurrencyManagerが指す行と、DataGrid1が指す行が
一致しなくなっていたようです。

保存処理実行前、上記(1)〜(3)実行後に それぞれ
CurrencyManagerの指すPositionとDataGrid1が指すCurrentCell.RowNumberを
取得したところ、下記のようになりました。

------------------------------------------------------------------
保存処理実行前に、DataGrid1上の任意の行(x)を選択
CType(BindingContext(View1),CurrencyManager).Position = x
DataGrid1.CurrentCell.RowNumber = x

(1)実行後
CType(BindingContext(View1),CurrencyManager).Position = x
DataGrid1.CurrentCell.RowNumber = x

(2)実行後
CType(BindingContext(View1),CurrencyManager).Position = -1
DataGrid1.CurrentCell.RowNumber = x

(3)実行後
CType(BindingContext(View1),CurrencyManager).Position = 0
DataGrid1.CurrentCell.RowNumber = x
------------------------------------------------------------------

この後、DataGrid1上でデータの編集をしようとすると、
エラー「ListManagerへの位置はrowNumと同じでなければなりません」
が発生するということが分かりました。

そこで、処理(3)の後に下記処理(4)を追加してみると、
エラーが出なくなりました。

処理(4)
------------------------------------------------------------------
CType(BindingContext(View1),CurrencyManager).Position _
= DataGrid1.CurrentCell.RowNumber
------------------------------------------------------------------

又、ソート・フィルタ実行時の同エラー回避のため、
DataGrid1のCurrentCellChangedイベントにも処理(4)を追加しました。

これで、例のエラーは出なくなったのですが、
下記データがDataGrid1に表示されており
列column2にフィルタ(column2=100)がかかっているとして、
行#2の列column2の値を変更後、「↓」キーで移動しようとすると
エラー「インデクスが配列の境界外です」が発生してしまいます。

行# column1 column2
---------------------
0 A 100
1 B 100
2 C 100
3 D 100

最初の質問とは違う内容ですが、どなたかご存知の方、教えて下さい。
よろしくお願い致します。
1

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