- PR -

削除での行アクセスエラーについて

投稿者投稿内容
kkk
常連さん
会議室デビュー日: 2004/09/17
投稿数: 33
投稿日時: 2005-03-02 10:11
現在、.netでWindowsアプリを開発していますが、なかなか解決できない問題が発生しています。情報ある方、なんでも結構ですので、情報提供おねがいいたします。

状況:
Winアプリにおいて、一覧(datagrid)から行を選択し、削除ボタンで行削除を行います。削除はうまくいくのですが、その後、削除した行数の行をクリックすると、以下エラーが出ます。
「削除された行を通して、その行の情報にアクセスすることはできません。」
→エラーを回避し、その削除した行数の行にある新たなデータ(削除前の次の行)を取得したい。

削除処理:
Me.BindingContext(objDS_XXX, "XXX").RemoveAt(Me.BindingContext(objDS_XXX, "XXX").Position)

以上、回避策ありましたら、情報提供よろしくお願いします。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-03-02 11:13
引用:

削除処理:
Me.BindingContext(objDS_XXX, "XXX").RemoveAt(Me.BindingContext(objDS_XXX, "XXX").Position)


↑行を削除するのに
この方法は使ったことがないので同じ方法ではアドバイスできませんが、、。
”objDS_XXX”は、名前からするとDataSetですかね?

参考になるか不明ですが、私的にやったことのある方法で、
テーブルのある行を削除するなら、
DataTable.Rows(index).Delete()
DataTable.AcceptChanges()

か、
DataTable.Rows.Remove(DataTable.Rows(index))
DataTable.AcceptChanges()



[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-03-02 12:41 ]
kkk
常連さん
会議室デビュー日: 2004/09/17
投稿数: 33
投稿日時: 2005-03-02 13:20
お返事ありがとうございました。

試してみましたが、うまくいきませんでした。
要件が一つもれていましたが、データセットを更新・削除し、最後にDBに更新をかけることになっています。このため、AcceptChangesは使えません。

@DataTable.Rows(index).Delete() での試行は以前と同じエラーでした。
ADataTable.Rows.Remove(DataTable.Rows(index))
では、削除後、DB登録でDB更新されません(変更なしと認識される)。

上記から、@では、表示されている行数とindexがずれていることが問題(削除されたindexが)
kkk
常連さん
会議室デビュー日: 2004/09/17
投稿数: 33
投稿日時: 2005-03-02 13:23
すみません、送信されてしまいました。以下続き。

上記から、@では、表示されている行数とindexがずれていることが問題(削除されたindexが使えない)
Aでは、削除行の変更が取得できない(getChanges)ことが問題です。

途中経過の報告ですが、何かかかわる情報ありましたらご助力願います。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2005-03-02 14:02
DataGrid 上で選択されているレコード(カレントレコード)を取得するには、連結するデータソースの BindingManagerBase を利用して取得します。

'DataGridに連結する BindingManagerBase を取得する。
dim bmb as BindingManagerBase = dg.BindingContext(objDS_XXX, "XXX")
'DataGgidのカレントレコードを取得する
dim row as Object = bmb.Current
'DataGridのカレントレコードが DataRowView の場合は、Cast する.
dim dv as DataRowView = CType(bmb.Current, DataRowView)

'DataGgidのカレントレコードのレコード番号を取得する
dim position as Integer = bmb.Position
kkk
常連さん
会議室デビュー日: 2004/09/17
投稿数: 33
投稿日時: 2005-03-02 16:20
OSさん
ご指摘ありがとうございました。
試してみましたが、NGでした。
若干やりたいことの説明が不十分で申し訳ありません。以下に例を示します。

datagrid上表示
0 aaaaa …datagridのindex=0、datasetのindex=0
1 bbbbb …datagridのindex=1、datasetのindex=1
2 ccccc …datagridのindex=2、datasetのindex=2

上記のような表示があります。2行目を削除します。

datagrid上表示
0 aaaaa …datagridのindex=0、datasetのindex=0
1 ccccc …datagridのindex=1、datasetのindex=2 ←選択
上記説明:datagridのindex=1にてdatasetからデータ取得しようとするが、datasetのindex=1は削除済み(RemeveAt,deleteメソッドだと、データはコミットまで存在はするがアクセス不可。Removeメソッドだと完全に削除される。)のため、エラーしまう。取得したいのは、datasetのindex=2のデータ。

上記のように、削除により、表示のindex値とdetasetのindex値が異なってしまう場合、うまく機能しません。こういった場合、どのように実装すると最適なのでしょうか?
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2005-03-02 16:46
確認ですが、DataGrid上で削除した後、
DataGrid上のあるレコードを選択したとき。
そのレコードのデータを取得したいのではないですか?

kkk
常連さん
会議室デビュー日: 2004/09/17
投稿数: 33
投稿日時: 2005-03-02 16:57
OSさん
お疲れ様です。okaです。
おっしゃるとおりですが、一部補足させていただきます。
datagid上で削除した後、datagrid上のあるレコード(削除した行が3行目であれば、3行目に新たに表示されたデータ)を選択したとき、そのレコードを取得したいのです。

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