- PR -

DataGridとDataTableの関係

1
投稿者投稿内容
えれ
会議室デビュー日: 2004/06/18
投稿数: 10
投稿日時: 2004-10-21 14:04
お世話になります。
現在 ASP.NET + VB.NET の組み合わせでシステム構築を行っています。

現在、DataGridを使用する画面があります。
ここにおいて以下の作業を行おうとした際にエラーが発生します。

1:DataGrid内のCommandButton において
  削除ボタン押下を行う(CommandNameは "delete"にしてある)

2:削除イベントにおいて、そのテーブルデータから
  対象行を削除し、バインドする

3:ここにおいて、2の操作後 グリッド全体の行Noを更新するために
  デーブルデータ内の行Noを再採番し、振り直します。

4:最初のデータ行へ値を入れようとするとエラーが出てしまいます。

5:エラー内容は
   行1 は 読み取り専用となっています

という、内容です。
私が思うには、データグリッドの削除コマンド実行中は
指定された行の編集しかできないのではないかと予想しています。

なぜなら、削除後のバインド後にEditItemIndexを-1で初期化
操作しようとする行のインデックス(今回で言うと 1です)を代入して
行操作(再採番し、振り直し)を行ってもエラーが解決しなかったのです。

これは仕様でしょうか?
もしこれが不可能だった場合には、どの様に
行Noの更新を行削除と同時に行えばよいでしょうか?
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-10-21 14:48
DataGridのDataBind後にDataTableのデータを変更する...
DataBind前にDataTableのデータを変更しとくのでは、ダメなんでしょうか?
引用:

MSDN:
DataBind メソッドは、データ ソース内の情報が更新された後にデータ ソースとデータ リスト コントロールの同期をとるためにも使用されます。これによって、データ ソースが変更されると、データ リスト コントロールも更新されます。


DataBind後にDataTableを変更すると、コントロールとの同期がとれなくなるから仕様通りかと思うのですが。

えれ
会議室デビュー日: 2004/06/18
投稿数: 10
投稿日時: 2004-10-21 15:20
えんぞ@見習さん

ご回答ありがとうございます。

引用:

MSDN:
DataBind メソッドは、データ ソース内の情報が更新された後にデータ ソースとデータ リスト コントロールの同期をとるためにも使用されます。これによって、データ ソースが変更されると、データ リスト コントロールも更新されます。



上記についてですが、それに関しましては仕様どおりだと認識しています。

今問題としているのは

DataGrid中の削除イベントにおける対象行以外のデータ更新の可・不可
が知りたいのです。要は、えんぞ@見習さんの仰る
「DataBind前にDataTableのデータを変更しとく」これ自体が
対象行以外についてはそのイベントで不可ではないのか?という事です。

私の説明が足りず伝わらず申し訳ありませんでした。
この書き込みも合わせて一読頂き、
もしお分かりになれば どなたでも結構ですのでご教授願えればと思います。

よろしくお願いします。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-10-21 15:52
引用:

えれさんの書き込み (2004-10-21 15:20) より:

対象行以外についてはそのイベントで不可ではないのか?という事です。


(逆に訊いてしまうことになりますが...)
DataGridのイベントにおいて、「この行しかデータを変更してはならない!」という制約がどこかにあったのでしょうか?
えれ
会議室デビュー日: 2004/06/18
投稿数: 10
投稿日時: 2004-10-21 16:08
具体的なコードにしますと

※定義済み変数郡

dtTempMoneygrid :As DataTable
Grid1 :As System.Web.UI.WebControls.DataGrid

↓ソースコード---------------------------------------------

Public Sub TmpGrid_Delete _
(ByVal sender As Object, ByVal e As DataGridCommandEventArgs)

'データ行へ代入
Dim dr As DataRow = _
CType(dtTempMoneygrid.Select("行 = " & _
(e.Item.ItemIndex + ).ToString).GetValue(0), DataRow)
'データ行削除
dr.Delete()
'データソース代入
Grid1.DataSource = dtTempMoneygrid
'データバインド処理
Grid1.DataBind()

'かなり行を省略して以下はデータ行がある前提でのコーディング
'ここでは、データ行を詰めるために
'行番号を 2 → 1 へと代入しようとしている
dr = CType(dtTempMoneygrid.Select("行 = 2", DataRow)
● dr("行") = 1
'データソース代入
Grid1.DataSource = dtTempMoneygrid
'データバインド処理
Grid1.DataBind()


   ↑ここまでソース--------------------------------------

上の●部分でエラーが起きるわけです。
このイベントにおいて e.Item.ItemIndex で取れる行に関しての
データ行削除は行えるのです。ですが、行=2 の更新は行えないのです。

説明がかなりチグハグですが、お分かりいただけますでしょうか?


「変更してはいけない!」とはどこにも定義されていないはずですが
なぜこんな事になるのでしょうかねぇ;;;
未記入
ベテラン
会議室デビュー日: 2002/09/10
投稿数: 68
投稿日時: 2004-10-21 16:47
もしかして行は主キーかユニークになってて、
● dr("行") = 1

dr("行") = 9999 (DataTableにない値)
とかにしたら通るんじゃないでしょうか
だとしたら、単なる制約違反で、
Deleteした後、
DataTable.AcceptChangesメソッドを呼べばいいのではないのでしょうか

確認せずに書いてます。はずしてたらごめんなさい。

えれ
会議室デビュー日: 2004/06/18
投稿数: 10
投稿日時: 2004-10-21 17:42
ご回答頂いた皆様へ

大変申し訳なかったのですが

データ行である 行Noを ReadOnly = True

にしてあり 読み取り専用で怒られていただけでした。

本当にご迷惑お掛けしました。

当初の問いからすると、イベント中でも

他行の更新は可能でした。お騒がせしてすみませんでした;
1

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