C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CellLeave  イベント 


(過去ログ 30 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■14365 / inTopicNo.1)  CellLeave  イベント 
  
□投稿者/ しほちゃん★ (20回)-(2008/02/16(Sat) 09:25:53)

分類:[VB.NET/VB2005] 

2008/02/16(Sat) 09:26:27 編集(投稿者)

☆環境vb2005 windowsアプリケーション framework2.0

・datagridview上でEnterを押した時、右に移動するコンポーネントクラスを作成いたしました。
それをForm1に貼り付けました。(名称:EnterGird)
Enter最後の列でEnterを押した時にEnterGird(0,currentrow+1)移動ソース  ・・・・・・・・@
EnterGird(currentcolumn,2)でEnterを押すとEnterGird(cuurentcolumn,6)に飛ぶソースをEntergrdList_KeyDown・・・・A
に書いています。
しかしこれはcell全体を選択されているときにきちんと動きますがcell内にカーソルがある時にうごきません。
当たり前のことですが、
なのでcellのfocusが離れた時に@とAをかけばいいとおもいますが適当なイベントがありません。
cellleaveにAを書くと無限ループしてしまいます。

Private Sub EnterTabgrdList_CellLeave(ByVal sender As Object, ByVal e As_ System.Windows.Forms.DataGridViewCellEventArgs) Handles EnterTabgrdList.CellLeave
'今の行と列を取得
Dim currentRow As Integer = EnterTabgrdList.CurrentRow.Index
Dim currentColumn As Integer = EnterTabgrdList.CurrentCell.ColumnIndex

Select Case currentColumn
Case 2
EnterTabgrdList.CurrentCell = EnterTabgrdList(6, currentRow)

end sub

cellのkeydownみたいなイベントもしくはcellのlostfocusってありませんか?
かんりはまています。;;
ご回答宜しくお願いいたします。

引用返信 編集キー/
■14367 / inTopicNo.2)  Re[1]: CellLeave  イベント 
□投稿者/ 魔界の仮面弁士 (632回)-(2008/02/16(Sat) 10:14:28)
No14365 (しほちゃん★ さん) に返信
> Dim currentRow As Integer = EnterTabgrdList.CurrentRow.Index
> Dim currentColumn As Integer = EnterTabgrdList.CurrentCell.ColumnIndex

CellLeave イベント内であれば、e.ColumnIndex, e.RowIndex を使いましょう。

また、たとえ CellLeave イベントの外であったとしても、
現在のセル位置を調べるためだけに、CurrentCell を使うのは避けましょう。

位置が知りたいだけならば、CurrentCellAddress を使います。
 Dim pos As Point = dataGridView1.CurrentCellAddress
 Dim currentRow As Integer = pos.Y
 Dim currentColumn As Integer = pos.X

位置以外の情報(.Value など)にもアクセスしたいのであれば、CurrentCell でも良いですが、
その場合、「CurrentCell が Nothing を返す事もある」事を考慮しておいてください。


> cellのkeydownみたいなイベントもしくはcellのlostfocusってありませんか?
それは、編集モードに入っているかどうかで異なるかと思います。
編集中の場合は、DataGridView そのもののイベントではなく、
EditingControlShowing の e.Control で得られるコントロールのイベントを使ってみてください。

ただ、拾いたいのが Enter キーという事になると、DataGridView の派生クラスで、
ProcessDialogKey メソッドを Overrides する必要があるかも知れません。
引用返信 編集キー/
■14370 / inTopicNo.3)  Re[2]: CellLeave  イベント 
□投稿者/ しほちゃん★ (21回)-(2008/02/16(Sat) 11:18:53)
No14367 (魔界の仮面弁士 さん) に返信
> ■No14365 (しほちゃん★ さん) に返信
> 位置以外の情報(.Value など)にもアクセスしたいのであれば、CurrentCell でも良いですが、
> その場合、「CurrentCell が Nothing を返す事もある」事を考慮しておいてください。

ありがとうございます。参考にいたします。
>

> 編集中の場合は、DataGridView そのもののイベントではなく、
> EditingControlShowing の e.Control で得られるコントロールのイベントを使ってみてください。

editingcontrolshowingは編集時のイベントだとおもいます・・・・・・・・編集終了時に移動なので
しかもe.controlは選択せれているのcellなのでfocusで他のcellはとれないとおもいます。
選択されているプロパティではうまくいかなのでは、私の頭がかたいのかもしれません。

>
> ただ、拾いたいのが Enter キーという事になると、DataGridView の派生クラスで、
> ProcessDialogKey メソッドを Overrides する必要があるかも知れません。

よくわからないのでこのキーワードで検索してみます。

ご回答ありがとうございます。
引用返信 編集キー/
■14371 / inTopicNo.4)  Re[3]: CellLeave  イベント 
□投稿者/ 魔界の仮面弁士 (633回)-(2008/02/16(Sat) 11:47:53)
2008/02/16(Sat) 11:48:34 編集(投稿者)
No14370 (しほちゃん★ さん) に返信
> editingcontrolshowingは編集時のイベントだとおもいます・・・・・・・・
編集が開始された事を知るためのイベントではなく、
編集用のコントロールが表示されたことを知るためのイベントです。

このイベント時の e.Control は、DataGridView.EditingControl と同一です。


> しかもe.controlは選択せれているのcellなのでfocusで他のcellはとれないとおもいます。
> 選択されているプロパティではうまくいかなのでは、私の頭がかたいのかもしれません。
編集中は、DataGridView の上に テキストボックス等が重ねて配置されている状態になります。
そのテキストボックスを得るのが、EditingControlShowing です。

# 正確には、DataGridView の上に、パネル(DataGridView.EditingPanel)があり、
# さらにそのパネルの上に、DataGridView.EditingControl があるという構造です。

別のセルをクリックすると、入力モードが解除されるため、その TextBox の Leave が発生します。
さらにセル移動に伴い、CellEnter/CellLeave も発生します。


空のフォームに下記のコードを貼り、[出力]ウィンドウの内容を追跡してみてください。

WithEvents dgv1 As New DataGridView()
WithEvents editor As Control
Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    dgv1.Dock = DockStyle.Fill
    dgv1.RowCount = 10
    dgv1.ColumnCount = 3

    ' EditMode によって、EditingControlShowing の発生タイミングが
    ' 変化しますが、何を選んでも一緒。
    dgv1.EditMode = DataGridViewEditMode.EditOnEnter
    'dgv1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2

    Controls.Add(dgv1)
End Sub
Sub dgv1_EditingControlShowing(ByVal sender As Object, _
  ByVal e As DataGridViewEditingControlShowingEventArgs) _
  Handles dgv1.EditingControlShowing
    editor = e.Control
End Sub

Sub dgv1_CellEnter(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
  Handles dgv1.CellEnter
    Debug.Print("CellEnter:{{X={0},Y={1}}}", e.ColumnIndex, e.RowIndex)
End Sub
Sub dgv1_CellLeave(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
  Handles dgv1.CellLeave
    Debug.Print("CellLeave:{{X={0},Y={1}}}", e.ColumnIndex, e.RowIndex)
End Sub

Sub editor_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles editor.Enter
    Debug.Print("Editor_Enter:" & dgv1.CurrentCellAddress.ToString())
End Sub
Sub editor_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles editor.Leave
    Debug.Print("Editor_Leave:" & dgv1.CurrentCellAddress.ToString())
End Sub

引用返信 編集キー/
■14372 / inTopicNo.5)  Re[3]: CellLeave  イベント 
□投稿者/ 魔界の仮面弁士 (634回)-(2008/02/16(Sat) 12:16:06)
No14370 (しほちゃん★ さん) に返信
>>ただ、拾いたいのが Enter キーという事になると、DataGridView の派生クラスで、
>>ProcessDialogKey メソッドを Overrides する必要があるかも知れません。
> よくわからないのでこのキーワードで検索してみます。

これでどうかな…。


Partial Public Class Form1
    WithEvents dgv1 As New CustomDataGridView()

    Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        dgv1.Dock = DockStyle.Fill
        dgv1.RowCount = 10
        dgv1.ColumnCount = 3
        dgv1.EditMode = DataGridViewEditMode.EditOnEnter
        Controls.Add(dgv1)
    End Sub

    Sub dgv1_EnterPressed(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
        Handles dgv1.EnterPressed
        Debug.Print("EnterPressed:{{X={0},Y={1:0}}}", e.ColumnIndex, e.RowIndex)
    End Sub

    Class CustomDataGridView
        Inherits DataGridView
        Public Event EnterPressed As DataGridViewCellEventHandler
        Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
            If keyData = Keys.Enter Then
                Dim pos As Point = MyBase.CurrentCellAddress
                RaiseEvent EnterPressed(Me, New DataGridViewCellEventArgs(pos.X, pos.Y))
            End If
            Return MyBase.ProcessDialogKey(keyData)
        End Function
        Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
            If e.KeyData = Keys.Enter Then
                Dim pos As Point = MyBase.CurrentCellAddress
                RaiseEvent EnterPressed(Me, New DataGridViewCellEventArgs(pos.X, pos.Y))
            End If
            MyBase.OnKeyDown(e)
        End Sub
    End Class
End Class

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -