- - PR -
エラー「ListManagerへの位置はrowNumと同じでなければなりません」について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-03-22 18:50
DBの保存部分なんですがFillした後はどのような処理になっているのでしょうか?
おそらくDataGridの編集行からキー項目を取得してテーブルから該当する データを検索していると思いますが、そのあたりの処理をコメントアウト してみてエラーがでなくなるかチェックしてみてはどうでしょうか |
|
投稿日時: 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