Who are you?


이동범(Dongbum Lee)


Microsoft Regional Director


Microsoft MVP - VB.net


MHVB.net 시삽

Wanna talk with me?

Here I am

Subscription

MSN 메신저를 통해 글이 갱신되면 알려드립니다.

Windows Live Alerts

Search

Navigation

Categories

.net (14) Ajax (1) asp.net (2) AxWebBrowser (1) blog (3) browser (1) das blog (1) dasBlog (2) DataGridView (1) Google (1) ie (1) iis (1) javascript (1) jQuery (1) Microsoft (14) Office (2) OOXML (1) Silverlight (1) Team System (2) UX (1) VB (3) vb.net (4) Vista (1) visual studio (5) visual studio 2010 (1) windows7 (1) Winform (3) WinFX (1) WPF (2) 독점 (1) 성산포 (1) 음악 (1) 일상 (8) 조용필 (1)

On this page

Archive

Blogroll

Notice

알림
본 블로그는 저의 개인적인 의견을 담고 있습니다.
제가 몸담고 있는 조직의 공식적인 의견과는 다를 수 있습니다.

RSS 2.0 | Atom 1.0 | CDF Send mail to the author(s) E-mail

BlogStats

Total Posts: 41
This Year: 0
This Month: 0
This Week: 0
Comments: 9

Sign In

# Thursday, August 23, 2007
Thursday, August 23, 2007 7:32:17 AM (Korea Standard Time, UTC+09:00) ( .net | DataGridView | Winform )

(Moving focus to next cell when 'Enter' key is pressed in DataGridView)

비따 회원 중 한분이 DataGridView에서 데이터를 편집시 Enter Key를 입력하면 왜 다음 셀로 이동하지 않고 다음 행으로 옮겨 가는지, 여간 불편하지 않다라는 질문을 해 왔다.

왜 DataGridView에서는 Enter키를 입력하면 다음 행의 셀로 이동하는 것일까?
해답을 찾기 위해 일단 Reflector를 통해 DataGridView에서 EnterKey가 입력될 때 수행하는 동작이 들어있는 DataGridView의 ProcessEnterKey 를 열어 보았다.

<SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Protected Function ProcessEnterKey(ByVal keyData As Keys) As Boolean
    Dim moved As Boolean = False
    Dim flag2 As Boolean = True
    Dim flag3 As Boolean = True
    If ((keyData And Keys.Control) = Keys.None) Then
        flag3 = False
        keyData = (keyData And Not Keys.Shift)
        flag2 = Me.ProcessDownKeyInternal(keyData, moved)
    End If
    If Not moved Then
        Dim dataGridViewCurrentCell As DataGridViewCell = Nothing
        If (Me.EditMode = DataGridViewEditMode.EditOnEnter) Then
            If (Me.ptCurrentCell.X <> -1) Then
                dataGridViewCurrentCell = Me.CurrentCellInternal
                Dim args As DataGridViewDataErrorEventArgs = _ 
                  Me.CommitEdit((dataGridViewCurrentCell), _
                  (DataGridViewDataErrorContexts.Commit Or _
                  DataGridViewDataErrorContexts.Parsing), _
                  DataGridViewValidateCellInternal.WhenChanged, _
                  False, False, False, False, False) If ((Not args Is Nothing) AndAlso args.ThrowException) Then Throw args.Exception End If End If Else Me.EndEdit((DataGridViewDataErrorContexts.Commit Or
            DataGridViewDataErrorContexts.Parsing), _
            DataGridViewValidateCellInternal.WhenChanged, False, False, _       
            False, False, False, True, True, True) End If If (Not flag3 OrElse Not Me.IsCurrentRowDirty) Then Return flag2 End If dataGridViewCurrentCell = Nothing Dim x As Integer = Me.ptCurrentCell.X Dim y As Integer = Me.ptCurrentCell.Y If Me.IsInnerCellOutOfBounds(x, y) Then Return flag2 End If If Me.OnRowValidating((dataGridViewCurrentCell), x, y) Then Return flag2 End If If Me.IsInnerCellOutOfBounds(x, y) Then Return flag2 End If Me.OnRowValidated((dataGridViewCurrentCell), x, y) End If Return flag2 End Function

다른 코딩들은 잘 분석해 보시고~ 여기서 붉은 색으로 표시되어 있는 부분을 살펴보면 짐작할 수 있듯 알아서~ 다음 행으로 CurrentCell을 이동시키는 코드가 들어있다.

 

이를 가로채기 위해서 일단 ProcessCmdKey 메서드를 Override 하기로 한다. ProcessCmdKey가 뭐냐구?
ProcessCmdKey 메서드란 컨트롤에서 명령키를 처리하기 위해 메세지를 전처리하는 동안 발생하는 메서드이다.(말이 어렵나? 나도 설명하기 어려워서 MSDN의 설명을 그대로 차용했다) 예기인 즉슨 컨트롤에 키가 입력되면 먼저 가로챌 수 있는 곳이라 생각하면 되겠다.

또 하나 처리해 줘야 할 메서드는 ProcessDataGridViewKey 이다. 해당 메서드는 DataGridView컨트롤에서 이동을 위한 키 입력시 입력된 키를 가로챌 수 있는 부분이다. 이 역시 앞서 설명한 ProceddCmdKey와 동일한 메서드이나, DataGridView에 특화된 메서드라 생각하자.

이 두개의 메서드에서 EnterKey가 입력으로 들어오면 기존에 정의된 ProcessDownKeyInternal 을 호출되기 때문에, EnterKey를 Right키로 가로채 바꿔치기를 하면 된다.

Public Class MyDataGridView
    Inherits System.Windows.Forms.DataGridView 

    Private isAutoCellMoved As Boolean = False
    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, _                                                 
                                                ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If (Me.CurrentCell.ColumnIndex <> Me.ColumnCount - 1) AndAlso (keyData = Keys.Enter) Then
            Return Me.ProcessRightKey(keyData)
        End If
        Try
            Return MyBase.ProcessCmdKey(msg, keyData)
        Finally
            If keyData = Keys.Enter Then
                If Me.Rows.Count <> Me.CurrentCell.RowIndex + 1 Then
                    Me.CurrentCell = Me(0, Me.CurrentCell.RowIndex + 1)
                    isAutoCellMoved = True
                End If
            End If
        End Try
    End Function 

    Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
        If isAutoCellMoved Then
            isAutoCellMoved = Not isAutoCellMoved
            Return True
        End If 

        If (Me.CurrentCell.ColumnIndex <> Me.ColumnCount - 1) AndAlso (e.KeyData = Keys.Enter) Then
            Return Me.ProcessRightKey(e.KeyData)
        End If
        Return MyBase.ProcessDataGridViewKey(e)
    End Function 

위의 코드를 잘 보면, EnterKey가 입력될 시, ProcessRightKey를 호출하여 마치 Right 키를 누른 것 처럼 메세지를 넘겨 버리는 것을 알 수 있다.
하지만 무작정 Enter를 친다고 Right Key가 눌려진 것 처럼만 한다면 어떻게 될까?

맨 마지막 컬럼에서 EnterKey를 치게 되면 원래 ProcessRightKey의 기본 행태인 다음 행의 동일한 컬럼으로 포커스가 이동되고 만다.
하지만 원래 우리가 원하는 것은 맨 마지막 컬럼까지 포커스가 이동했다면, 다음번 EnterKey에는 그 다음 행의 첫번째 컬럼으로 가는 것이 보기도 좋고,
기본적으로 어플리케이션 사용자들이 그리드에서 다수의 데이터를 입력하고자 할때 편의를 제공해 줄 수 있을 것이다.

그래서 일반적은 경우에는 ProcessRightKey를 호출하지만, CurrentCell이 마지막 컬럼에 위치하고 있을 경우에는 직접 CurrentCell을 다음 행의 첫번째
컬럼으로 이동시키게 하는 코드를 추가했다. 또 하나 CurrentCell이 맨 마지막 행, 마지막 컬럼에 위치하고 있다면? 그냥 둔다 <img alt=" src="smilies/happy.gif">

개발자들의 취향에 맞게 고쳐쓰면 될 듯 싶다.

상용 컴퍼넌트를 구매하지 않고 기본 컨트를을 통하여 우리의 입맛에 맞게 바꾸기 위해 이러저러한 궁리와 코딩을 하다보면, 컴퍼넌트 가격이 참 저렴하다라는 생각이 든다.

비싼 개발자들의 인건비를 100만원정도 하는 상용컨트롤 구매와 맞 바꾸려 하다니 -.-
개발자는 자고로 비지니스로직 구현에만 전념할 수 있도록 하면 되거늘... 

여전히 시장선 개발자의 인건비가 X 값이다

에휴우....

Comments [1] | Trackback | # 
Related posts:
Visual Studio 2010 to come with ‘Black Box’
Why VB? It’s Dynamic !
UI의 생산성을 높여주는 획기적인 아이디어! - NukeationMachine
Source code of Visual Basic runtime has been released to public
AxWebBrowser 컨트롤을 사용하는 MDI 폼에서 Focus를 받을 수 없다구?
Visual Studio 2008 Beta2 is now available for download!!
Tracked by:
"http://yesihavemoneyy.com" (http://yesihavemoneyy.com) [Pingback]
"http://tubepornoss.com" (http://tubepornoss.com) [Pingback]

Referred by:
datagridview (www.google.co.kr) [Referral]
datagridview (www.google.co.kr) [Referral]
DataGridView (www.google.co.kr) [Referral]
datagridview processcmdkey (www.google.ba) [Referral]
datagridview (www.google.co.kr) [Referral]
datagridview+enter (www.google.ru) [Referral]
CurrentCellInternal (www.google.com) [Referral]
false (search.live.com) [Referral]
ProcessDataGridViewKey override (www.google.com) [Referral]
datagridview (www.google.co.kr) [Referral]
enter Ű (search.daum.net) [Referral]
datagridview move to next cell enter (www.google.com) [Referral]
tag:datagridview (blogs.icerocket.com) [Referral]
vsto dim keyeventargs (www.google.com) [Referral]
cache:19deukKrJf8J:blogs.icerocket.com/tag/datagridview datagridview move focus to next cell (64.233.183.104) [Referral]
enterŰ (search.daum.net) [Referral]
http://www.lucky-blackjack.org/ [Referral]
ProcessEnterKey datagridview (www.google.com) [Referral]
dataGridView 입력 (www.google.co.kr) [Referral]
tag:datagridview (blogs.icerocket.com) [Referral]
ENter+DataGridView EditMode (www.google.com.pe) [Referral]
processEnterkey (www.google.com) [Referral]
datagridview (www.google.co.kr) [Referral]
visual studio 2005 datagridview enter move (www.google.no) [Referral]
visual studio 2005 datagridview move focus (www.google.no) [Referral]
datagridview (www.google.co.kr) [Referral]
DataGridView Enter (www.google.com) [Referral]
DataGridView enter right (www.google.com) [Referral]
http://www.roflcat.com/ [Referral]
visual studio 2005 datagrid (www.google.co.kr) [Referral]
DataGridView Enter (www.google.co.kr) [Referral]
vb net datagridview cell move right on enter (www.google.be) [Referral]
datagridview "move to next cell" (www.google.com) [Referral]
DataGridView Enter (www.google.co.kr) [Referral]
focus 다음으로 이동 (www.google.co.kr) [Referral]
Datagridview cell enter (www.google.co.kr) [Referral]
vb processenterkey (www.google.co.uk) [Referral]
datagridview enter key (www.google.co.kr) [Referral]
datagridview & enter (www.google.co.kr) [Referral]
datagridview move right (www.google.com) [Referral]
datagridview enter key move right (www.google.com) [Referral]
vb 포커스 이동 (www.google.co.kr) [Referral]
how to move to next cell in datagridview by enter key (www.google.co.in) [Referral]
how to move to next cell in datagridview by enter key (www.google.com) [Referral]
winform datagridview with enter move next cell (www.google.co.in) [Referral]
moving datagridview with enter (www.google.it) [Referral]
vb.net IsCurrentRowDirty (www.google.com) [Referral]
Datagridview AND Enter And Key And "Next cell" (www.google.com) [Referral]
visual DataGridview (www.google.co.kr) [Referral]
studio 2005 dataGrid (www.google.co.kr) [Referral]
datagridview (www.google.co.kr) [Referral]
enter포커스 (www.google.co.kr) [Referral]
dataGridView (kr.search.yahoo.com) [Referral]
datagridview enter move right vb.net (www.google.es) [Referral]
vb.net +datagridview +enter +"next cell" (www.google.se) [Referral]
winform datagrid 포커스 (www.google.co.kr) [Referral]
VB.NET dataGridView (www.google.co.kr) [Referral]
datagridview enter (www.google.co.kr) [Referral]
Reflector Daum (www.google.co.kr) [Referral]
vb.net ProcessEnterKey (www.google.de) [Referral]
datagridview Enter (www.google.co.kr) [Referral]
DatagridViewCell AND Enter (www.google.de) [Referral]
http://google.com/ [Referral]
datagridview Move Cell (www.google.co.kr) [Referral]
datagridview enter (search.daum.net) [Referral]
datagridview enter (web.search.daum.net) [Referral]
vs2005 grid move next cell (www.google.es) [Referral]
DataGridViewEditMode enter move to next cell (www.google.es) [Referral]
DataGridView1+mover+vb.net (www.google.com.br) [Referral]
ProcessCmdKey (www.google.co.kr) [Referral]
datagridview ProcessCmdKey (www.google.co.uk) [Referral]
datagridview next (www.google.co.kr) [Referral]
DATAGRIDVIEW ProcessEnterKey (www.google.cn) [Referral]
DataGridView enter (www.google.co.kr) [Referral]
ENTER right cell datagridview (www.google.ru) [Referral]
vb.net datagridview (www.google.co.kr) [Referral]
vb.net datagridview focus (www.google.co.kr) [Referral]
datagridview enter (www.google.co.kr) [Referral]
DataGridView Cell Move Enter (www.google.co.kr) [Referral]
datagridview (www.google.co.kr) [Referral]
키 입력 (www.google.com) [Referral]
DataGridView (kr.search.yahoo.com) [Referral]
vb.net +datagridview +enter +next +cell (www.google.se) [Referral]
vb enter key .net (www.google.com) [Referral]
DataGridView next cell (www.google.co.kr) [Referral]
vb.net datagridview (www.google.co.kr) [Referral]
ProcessCmdKey (www.google.co.kr) [Referral]
dataGridView update (www.google.co.kr) [Referral]
datagridview (www.google.co.kr) [Referral]
ProcessDataGridViewKey + vb.net (www.google.bg) [Referral]
datagridview enter key next cell (www.google.com) [Referral]
vb.net move right in a datagridview (www.google.co.uk) [Referral]
ProcessDataGridViewKey (www.google.com) [Referral]
datagridview focus (www.google.co.kr) [Referral]
how to get datagridviewcell Y in cell enter in VB.net (www.google.co.in) [Referral]
datagridview in vb.net (www.google.com) [Referral]
datagridview + 입력 (www.google.co.kr) [Referral]
datagridview enter (www.google.co.kr) [Referral]
enter 포커스이동 (www.google.co.kr) [Referral]
datagridview editmode (www.google.co.kr) [Referral]
vb.net datagridview (www.google.co.kr) [Referral]
datagridview move to the next cell using the enter key (www.google.com.gt) [Referral]
datagridview cell enter move focus (www.google.es) [Referral]
how to focus on next cell of datagridview in vb.net (www.google.com.pk) [Referral]
datagridview move right on enter 2008 (www.google.com.au) [Referral]
datagridview cell�̵� (kr.search.yahoo.com) [Referral]
datagridview cell�̵� (kr.search.yahoo.com) [Referral]
focus in cell of datagridview (www.google.com.vn) [Referral]
그리드 포커스 이동 (www.google.co.kr) [Referral]
datagridview + enterkey in vb.net (www.google.co.in) [Referral]
http://www.mhvb.net/ [Referral]
vb.net datagridview.update (www.google.co.kr) [Referral]
VB ENTER (www.google.co.kr) [Referral]
datagridview enter (www.google.co.th) [Referral]
datagridview (kr.search.yahoo.com) [Referral]
datagridview enterkey (kr.search.yahoo.com) [Referral]
ProcessenterKey visual basic (www.google.pl) [Referral]
datagridview enter (kr.search.yahoo.com) [Referral]
datagridview.processenterkey (www.google.com) [Referral]
processcmdkey (www.google.co.kr) [Referral]
andalso vb.net (www.google.co.kr) [Referral]
ProcessEnterKey (www.google.pl) [Referral]
forms.datagridview OnEnter move right (www.google.com) [Referral]
datagridview enter key move focus cell (www.google.co.nz) [Referral]
http://translate.google.com/translate?hl=en&sl=ko&u=http://w... [Referral]
how to throw DataGridViewDataErrorContexts Exception (www.google.com) [Referral]
datagridview (www.google.co.kr) [Referral]
Datagridview (www.google.co.kr) [Referral]
move next cell using enter key in datagridview +vb.net (www.google.co.in) [Referral]
http://translate.google.com/translate?hl=en&sl=ko&u=http://w... [Referral]
http://images.google.cn/imgres?imgurl=http://www.mhvb.net/fu... [Referral]
http://images.google.cn/imgres?imgurl=http://www.mhvb.net/fu... [Referral]
DataGridView update (www.google.co.kr) [Referral]
enter키download (livesearch.msn.co.kr) [Referral]
닷넷에서 enter (www.google.co.kr) [Referral]
datagridview cell update (www.google.co.kr) [Referral]
(www.google.com.pe)[Referral] (search.live.com) [Referral]
ProcessDataGridViewKey (www.google.co.kr) [Referral]
vb.net 키 (www.google.co.kr) [Referral]
datagridview moveto (www.google.fr) [Referral]
DataGridView.ProcessEnterKey (www.google.ru) [Referral]
datagrid enter (www.google.co.kr) [Referral]
basic net key 입력 (www.google.co.kr) [Referral]
datagridview 입력 (www.google.co.kr) [Referral]
http://translate.google.co.in/translate?hl=en&sl=ko&u=http:/... [Referral]
http://images.google.cn/imgres?imgurl=http://www.mhvb.net/fu... [Referral]
http://translate.google.ca/translate?hl=en&sl=ko&u=http://ww... [Referral]
http://translate.google.ca/translate?hl=en&sl=ko&u=http://ww... [Referral]
Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) in vb .net windows application (www.google.co.in) [Referral]
vb6 datagrid get current cell (www.google.co.kr) [Referral]
DataGridViewCell OnEnter EditMode (www.google.com) [Referral]
datagridview enter (www.google.co.kr) [Referral]
datagridview enter (www.google.co.jp) [Referral]
false (search.live.com) [Referral]
vb.net currentcell (search.daum.net) [Referral]
DataGridView enter right (www.google.ch) [Referral]
datagrid move next Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean (www.google.com.vn) [Referral]
datagridview 예제 (www.google.co.kr) [Referral]
datagridview (www.google.co.kr) [Referral]
winform datagrid (www.google.co.kr) [Referral]
datagridview currentcell move (www.google.co.kr) [Referral]
datagridview column enterkey (www.google.co.kr) [Referral]