- PR -

DATAGRIDVIEWでカレントセルを移動時にエラーが表示されます

1
投稿者投稿内容
ゆうじ
常連さん
会議室デビュー日: 2008/01/28
投稿数: 31
お住まい・勤務地: 東京都
投稿日時: 2008-04-06 18:20
度々申し訳ありませんが教えてください。
環境 VB2005
内容 DATAGRIDVIEWでカレントセルを移動時にエラーが表示されます
「SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。」

コード
Private Sub datagriduser_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles datagriduser.CellValueChanged
Try
ro = Me.datagriduser.CurrentCell.RowIndex
cu = Me.datagriduser.CurrentCell.ColumnIndex
code = CStr(datagriduser(cu, ro).Value)
Catch
End Try
End Sub
Private Sub datagriduser_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles datagriduser.CurrentCellChanged
cu = Me.datagriduser.CurrentCell.ColumnIndex
Select Case cu
Case 0
Me.datagriduser.CurrentCell = Me.datagriduser(3, 0)
Case 1
Me.datagriduser.CurrentCell = Me.datagriduser(5, 1)
End Select
End Sub
動作
datagriduserはENTERキーで右の列にカーソル移動します。
@DATAGRIDBIEW左端のセルで文字を入力後ENTER
A現在のカレントセルの列を取得後カレントセルの移動
Aでエラーが表示されます。

お手数をお掛けしますが、宜しくお願いします。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2008-04-06 20:35
DataGridViewではEnterイベント(というかフォーカス制御系イベント)発生の
流れにおいて「再度同様のイベントを発生させるような行為」は
例外が発生するようになっています。

今回ですと、CurrentCellChangedイベントの中でカレントセルを
更に移動させようとしているために発生していると思います。
ゆうじ
常連さん
会議室デビュー日: 2008/01/28
投稿数: 31
お住まい・勤務地: 東京都
投稿日時: 2008-04-06 23:09
返答ありがとうございます。
他のイベントに設定する等、何か良い方法はございませんでしょうか?
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2008-04-07 10:56
「Enterで右へ移動」という制御と「値によって移動するセルを変更」という制御が
バッティングしてしまっていることが根幹だと思いますので、
そのあたりを含めた見直しを行ったほうがいいかと思います。

「Enterで右へ移動」という制御をどこに書いてあるかによって、
対応は分かれると思いますね。
ゆうじ
常連さん
会議室デビュー日: 2008/01/28
投稿数: 31
お住まい・勤務地: 東京都
投稿日時: 2008-04-09 23:31
ご回答ありがとうございます。
ご指摘のとおり色々調べた結果、派生GRIDを作成後processcmdkeyをオーバーライドしENTERキーを補足し無効までは理解できたのですが、GRIDクラス内での
カレントセル移動の記述がわかりません。
GRIDクラス内でカレントセルの取得、移動制御は可能なのでしょうか?
コード
Protected Overrides Function ProcessCmdKey _
(ByRef msg As System.Windows.Forms.Message, _
ByVal keyData As System.Windows.Forms.Keys) As Boolean

If msg.Msg = WM_KEYDOWN Then
If (keyData = Keys.Enter) Then
Return True
’ここに記述が必要かと思うのですが。
Else
Return MyBase.ProcessCmdKey(msg, keyData)
End If
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
色々お手数をお掛けしまして申し訳ありませんが宜しくお願いします。
1

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