- - PR -
DataGridViewno
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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