- - PR -
DataGridとDataTableの関係
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-10-21 14:48
DataGridのDataBind後にDataTableのデータを変更する...
DataBind前にDataTableのデータを変更しとくのでは、ダメなんでしょうか?
DataBind後にDataTableを変更すると、コントロールとの同期がとれなくなるから仕様通りかと思うのですが。 | ||||
|
投稿日時: 2004-10-21 15:20
えんぞ@見習さん
ご回答ありがとうございます。
上記についてですが、それに関しましては仕様どおりだと認識しています。 今問題としているのは DataGrid中の削除イベントにおける対象行以外のデータ更新の可・不可 が知りたいのです。要は、えんぞ@見習さんの仰る 「DataBind前にDataTableのデータを変更しとく」これ自体が 対象行以外についてはそのイベントで不可ではないのか?という事です。 私の説明が足りず伝わらず申し訳ありませんでした。 この書き込みも合わせて一読頂き、 もしお分かりになれば どなたでも結構ですのでご教授願えればと思います。 よろしくお願いします。 | ||||
|
投稿日時: 2004-10-21 15:52
(逆に訊いてしまうことになりますが...) DataGridのイベントにおいて、「この行しかデータを変更してはならない!」という制約がどこかにあったのでしょうか? | ||||
|
投稿日時: 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 の更新は行えないのです。 説明がかなりチグハグですが、お分かりいただけますでしょうか? 「変更してはいけない!」とはどこにも定義されていないはずですが なぜこんな事になるのでしょうかねぇ;;; | ||||
|
投稿日時: 2004-10-21 16:47
もしかして行は主キーかユニークになってて、
● dr("行") = 1 を dr("行") = 9999 (DataTableにない値) とかにしたら通るんじゃないでしょうか だとしたら、単なる制約違反で、 Deleteした後、 DataTable.AcceptChangesメソッドを呼べばいいのではないのでしょうか 確認せずに書いてます。はずしてたらごめんなさい。 | ||||
|
投稿日時: 2004-10-21 17:42
ご回答頂いた皆様へ
大変申し訳なかったのですが データ行である 行Noを ReadOnly = True にしてあり 読み取り専用で怒られていただけでした。 本当にご迷惑お掛けしました。 当初の問いからすると、イベント中でも 他行の更新は可能でした。お騒がせしてすみませんでした; |
1