- PR -

DataGridViewでレコード更新時に更新者名を記録したい

投稿者投稿内容
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2007-04-16 11:08
 お世話になっております。DataGridViewで一行(レコード)に変更を加えて他のレコードへ移動するときや、保存して閉じるときに、「登録者名」というフィールドにユーザー名を記録したいと思い、次のように書いて見ましたが、イベントが無限に呼ばれているような感じでうまくいきませんでした。
具体的にはformがNewされるタイミングで無限ループとか再起呼び出しが多いとかと言われます。

 CellValueChangedというイベントに書くのがまずいのでしょうか。。


Private Sub T_PhoneDataGridView_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles T_PhoneDataGridView.CellValueChanged
'更新ユーザーと時刻をコントロールにセット
Me.T_PhoneDataGridView.Rows(e.RowIndex).Cells("dgv_p_upuser").Value = System.Environment.UserName
Me.T_PhoneDataGridView.Rows(e.RowIndex).Cells("dgv_p_update").Value = Now()
End Sub

よろしくご教授賜りたく存します。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-16 11:20
引用:

McLarenさんの書き込み (2007-04-16 11:08) より:

 CellValueChangedというイベントに書くのがまずいのでしょうか。。


CellValueChanged イベントは Cell の値が変更されたときに起きるイ
ベントですよね。

コード:

    '更新ユーザーと時刻をコントロールにセット
        Me.T_PhoneDataGridView.Rows(e.RowIndex).Cells("dgv_p_upuser").Value = _
            System.Environment.UserName
        Me.T_PhoneDataGridView.Rows(e.RowIndex).Cells("dgv_p_update").Value = _
            Now()


…えーと、Cell の値が変更されていませんか?

ここでコンピュータの動き

CellValueChanged イベントがキタ!
 ↓
更新ユーザーと時刻をセットするぞ!
 ↓
お、Cell が変更されているな。じゃあ CellValueChanged イベントを発生させなくちゃ!
 ↓
一番上に戻る

という感じなのではないかと。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2007-04-16 11:32
ありがとうございます。
そうなんです。。なので適切なイベントを今全部説明を見ているのですが、やはり見つかりません。。

 どのイベントを呼ぶのが正しいのでしょうか。。
イベント名をご教授いただけると大変助かります!
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-04-16 11:35
DataGridViewでレコードの新規登録者名をDBに記録したい初心者です。。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37894&forum=7
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-16 11:44
CellValueChanged のハンドラの中で
変更されたセル(e.ColumnIndex で判定)が
「更新ユーザー」とか「時刻」だったら処理しないようにすればどうでしょう?
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2007-04-16 13:14
KI様ありがとうございます。
『「更新ユーザー」とか「時刻」以外だったら処理しないように・・・』ということでよろしかったでしょうか。
それもなるほどです。ありがとうございます。

他にも

RowValidated

というイベントに書いてみたりしましたが、レコード間でカーソルを移動させただけで「更新ユーザー」と「時刻」が変わってしまいました。
Accessで言う「レコード更新前」に相当するイベントがあればよいのですが。。

 このようなとき、皆様はどうされていますか?保存処理の中でSQL文で放り込まれますでしょうか。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-16 14:51
データベースのテーブルに更新者・時刻のカラムがあって、
レコードを更新するときに、その列を更新したいというお話でよろしいでしょうか?

更新者はともかく時刻に関しては、どのタイミングで取得するかによって値が変わります。
そこは意識していらっしゃいますか?
たぶん以下の3種類くらいが考えられると思うのですが、どの時刻で更新したいのでしょうか?

(1) 保存するとき
(2) セルの内容が変更されたとき
(3) 行の編集が確定されたとき

(2)と(3)の違いについて補足しておきます。
(2)はセルの内容が変更されたときに発生します。
(3)はセルの内容が変更された後、カーソルが他の行に移動するなどして
行の編集が確定されたときに発生します。

実装方法を検討する前に、ここを明確にする必要があると思います。
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2007-04-16 15:00
KI様、ご検討いただき、まことにありがとうございます。
(3)を実現したいと思っております。

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