- PR -

DataGridでの一意違反

1
投稿者投稿内容
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2005-12-16 11:54
お世話になっております。
VB.NETでWindowsアプリケーションを作成していますが、データグリッドの処理で困ってしまい投稿させていただきました。

windowsフォーム上にデータグリッドを配置し、アクセスから読み込んだDataTableと接続しています。
ユーザによるグリッドの直接編集を可能としたいのですが、新規行に既に存在するキーの値を入力すると、「列'CategoryCode'は一意であるように制約されています。」というメッセージが表示されます。
過去の記事を参考にして、DataTableのColumnChangedイベントをキャッチすることでこのメッセージはキャッチすることができました。
一意違反をキャッチしたときに、CurrencyManagerをCancelCurrentEditをして、ユーザの新規行作成をキャンセルすることはできたのですが、ColumnChangedイベントが発生する要因のユーザによるセルの移動が入力中の新規行のさらに下にある次の新規行への移動だった場合、
「インデックスが配列の境界外です。値を修正しますか?」というメッセージがでて、ここで「いいえ」を選択するとエラーになってしまいます。

ColumnChangedイベントの中で、CancelCurrentEditをした後DataGridとCurrencyManagerの位置を取得してもずれはありませんでした。

コードは以下のとおりです。

コード:
Private Sub OnColumnChanged
    Try
        cmCategory.EndCurrentEdit() 'この行でエラーとなる。
    Catch ex As Exception
        MsgBox(ex.Message) '列'CategoryCode'は一意であるように制約されています。
        '''cmCategory.Position: 10
        '''grdCategory.CurrentRowIndex: 10

        cmCategory.CancelCurrentEdit()

        '''cmCategory.Position: 9
        '''grdCategory.CurrentRowIndex: 9
    End Try
End Sub



ColumnChangedイベントが既存もしくは編集中の新規行への移動によるものであれば問題なくユーザによる追加作業がなかったことになり終了するのですが、さらなる新規行への移動をしようとしてこのイベントが発生したとき、CancelCurrentEditをし、このイベントが終了すると上記の「インデックスが…」のエラーになってしまいます。

CancelCurrentEditの変わりにRemoveAtメソッドを使用しても同じで、DataTableの主キー設定を外し、ColumnChangedイベントで重複チェックをして削除をした場合でも結果は同じでした。

それならと新規行の入力をフォーム上のボタンクリックによる実装にしようかと思ったのですが、DataGridの編集可能かつ新規入力不可という設定方法がわからず、頓挫してしまいました。

どなたかアドバイスをいただけないでしょうか。
よろしくお願いいたします。
くろねこ
会議室デビュー日: 2005/12/16
投稿数: 1
投稿日時: 2005-12-16 14:48
VS2005ですと DataGrid ではなくて DataGridView コントロールがあります。
DataGridView コントロールですと AllowUserToAddRows プロパティがあります。
このプロパティを使用するとユーザが行を追加できなくなります。

もし、VS2005 で開発でしたらこちらをお使いになるといいかもしれません。
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2005-12-16 16:44
くろねこさん、ありがとうございます。
あいにくVS2003を使用しておりますので、AllowUserToAddRowsプロパティは使えません。
やっぱりどんどん便利になっていくんですね。

ですが、新規行の追加をさせない方法として、
DataTable.DefaultView.AllowNew = False
で対応できました。

ですので、プログラムとしてはDataGridから直接新規レコードを入力させないことでとりあえずの対応はできました。
が、根本的な解決をまだしていないので、急ぐ必要はなくなりましたが、今後も調べていきたいと思います。何か情報がありましたらご教授ください。

よろしくお願いします。
1

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