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

DataGridViewno

1
投稿者投稿内容
kit
会議室デビュー日: 2006/01/26
投稿数: 2
投稿日時: 2006-06-02 16:46
VS2005 C# SQLServer2000で開発しています。
WindowsFormでDataGridViewを使用しています。
型指定DataSetとBindingSourceを使用してDataGridViewと連携しています。

やりたいことは、
例えばSQLServerのEnterprizeManagerで、
テーブルを開いて値を書き換えると、データが更新されます。
この使い方をDataGridViewで実現したいと考えています。

行移動時のイベントを取得することはできました。

つまずいているのは、
DB更新に失敗し、例外が発生した場合の処理です。
EnterprizeManagerでは、更新エラーが発生すると
対象行が編集状態のまま、再度入力できるようになります。

しかし、上記のような構成ではこれができません。
そもそも構成に無理があるのでしょうか?



できない理由を説明します。

DB更新処理は、引数にDataSetを指定する方式です。
最終的にSqlDataAdapterのUpdateで更新します。
このとき整合性チェックや文字長さチェックなどで
SQLServer側のエラーが発生すると、
SqlDataAdapterで例外を出します。

この例外を捕まえて、
DataGridView上で編集確定前の状態に、
復帰したいのです。
復帰するには型指定DataSetの編集状態である必要があります。
(RowChangingイベントのCancelを使うイメージ)

しかし、DB更新処理を実行するためには、
型指定DataSetの編集処理を確定する必要があります。
(試しにRowChangingイベントでDB更新処理を実行しましたが、
 EndEdit()を呼び出せませんとエラーになっていまいました)

というわけで、今の考え方ですと
一度、型指定DataSetの編集を確定済みにしてから、
その後で、再び編集前の状態に戻したいということになり、
ここで要求に無理があるなということで、つまずいています。

コードで書くと、以下のように使いたいのです。

bindingSource.DataSource = dataset1;
bindingSource.DataMember = "Table1";
bindingSource.CurrentItemChanged +=
new EventHandler(bindingSource_CurrentItemChanged);
.
.
private void bindingSource_CurrentItemChanged(
object sender, EventArgs e) {
DataRowView drv = (DataRowView)bindingSource.Current;
if (drv.IsNew || drv.IsEdit)
return;

try {
DB更新処理();
} catch(Exceptio ex) {
e.Cancel = true;
e.Row.SetColumnError(ex.Message);
}
}

そもそもこういった使用方法は想定されていないのでしょうか?
1

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