PROGRAMMING WORKSHOP

VB.Net |
DataGridView+DataTable Event활용

VB.Net을 통한 .Net FrameWork의 자원을 현재 열심히 살펴보고
있는 중이다..
그중에서
System.Windows.Forms.DataGridView 콘트롤과
System.Data.DataTable 개체를
이렇게 저렇게 살펴보면서 개체들의 성질머리를 익히고 있다
특히 DataGridView는 데이타를 집합적으로 처리해주는 엑셀의
워크시트와 닮아서 더욱 잘 살펴보고 있는 것이다
다른 콘트롤에 비하여 가장 많은 기능을 갖고 있다고 해도 좋은 콘트롤이고
또한 뒷전에서 일을 해주는 DataTable 메모리상의 개체 또한
엑셀의 워크시트와 같은 유형의 일을 하는 개체라서 친근감이 있는 것들이다
다른 윈도우의 콘트롤들은 DataGridView콘트롤을 하면서
개평으로 쫓아 들어 올것이니..자연스럽게 익히실수 있다
다른 작은 콘트롤들은 엑셀프로그래밍에서 UserForm의 콘트롤들과 별로 큰 차이가 없다
이번페이지에서는 TextBox콘트롤을 더불어 사용해 보자

엑셀에서 워크시트의 셀을 선택하면 SelectionChange이벤트프로시져가
발생하고 워크시트를 선택하면 Activate이벤트프로시져가 발생하고
이 프로시져를 활용하면 좋고, 안해도 괞찮고 하듯이
모든 개체에는 이벤트프로시져가 있다
DataGridView에서도 물론 이벤트가 발생하고
DataGridView의 DataSource가 되는 DataTable개체도 이벤트가 많이 들어있다

디자인타임에 개체를 만든다면 디자인타임에 개체의 이벤트프로시져를
목록에서 볼수 있다
그런데 개체를 런타임에 생성하면 이벤트프로시져 또한 만들어야 한다
재미있지 않은가..
VB.Net에서는 흔히 개체를 만들고 또한 필요할때 이벤트프로시져를
만들어서 작성한다
마치 엑셀에서 개체를 만들고
만든개체.OnAction="프로시져이름"
을 주고 이벤트프로시져를 작성하였던 기억이 날 것이다
기억이 안 날수 도 있다..여행길에 집생각이 하나도 나고 죄다
잊저먹듯이..환경을 바꾸어서 작업을 하면 열심히 활용하던
환경의 분위기를 싸악 잊어 먹는다..잊어 먹는 것이 아니고 잘 생각이
안난다..
그러니..혹시 머리가 나쁜것이 아닌가..걱정하지 않아도 된다
정상적인 사람의 머리가 그렇게 생겨먹은 것이니까..
그러나 자꾸 왔다,갔다 하면 두개의 환경이 자연스러운 환경으로
머리속에 자리를 잡게 된다
그렇게 되기를 바라며..계속 .Net FrameWork세상을 탐험하자!!!
아직 VBA도 완전 파악이 안되었는데 ..하시는 분들도..
그냥 재미삼아 읽다 보면 도움이 될 것이다

메모리속에서 숨어서 일하는 DataTable의 이벤트를 활용해보자
사용자가 DataGridView의 셀의 값을 바꾸면
자동으로 DataSource로 연결되어 있는 DataTable도 바뀐다
이렇게 바뀌는 순간
RowChanged--------------행의 값이 완전히 바뀌었을때
RowChanging-------------행의 값이 바뀌려는 순간
RowDeleted--------------행이 삭제 되었을때
RowDeleting-------------행이 삭제되려고 하는 순간
같은 이벤트들이 발생한다
타이임이 좀더 세분화되어 있다
즉 마악 진행중이면 현재진행형이 붙고
이미 진행종료가 되면 과거형이 붙고..영어를 잘 하자고 하는 것도
모두 이런 감각이 그냥 붙어 버리면 그냥 개체를 놓고 쩜하나 찍으면
줄줄이 관련 멤버들이 나타나고 영어감각으로 그냥 보면..
흠..이럴때 이것을 쓰라는 것이군..!!!!
영어자체가 프로그래밍언어인 셈이니..
우노가 영어 열심히하자고 하는 것은 겉멋이 들어서 그러는 것이
절대 아니고 실용적, 현실적 삶을 좋게 하자는 의미인 것이다

위의 이벤트를 사용하여 무엇을 하겠다는 것인가??
예를 들면 DataGridView의 셀의 값을 바꾸었다
이때 바뀐값을 사용하여 계산을 시키고 싶은 것이다
이벤트프로시져가 없다면 ..버튼을 달아서 DataGridView의 값이 바뀐
시점과 관계없이 버튼을 누를때 계산을 하게 하지만
세상은 실시간 반응을 원한다



DataTable 다른 프로시져를 통하여 만들어서 얻어온후
이 DataTable개체에 이벤트를 달아 맨다

oTbl = MakeNamesTable()
AddHandler oTbl.RowChanged, New DataRowChangeEventHandler(AddressOf TableRowChanged)

.Net FrameWork에서는 New 하여 개체를 만드는 재미로 프로그래밍을
한다고 해도 과언이 아니다
위에서
이벤트프로시져를 만드는데도 DataRowChangeEventHandler 를 New하여
개체를 만든다!!!..아하..헷갈리게도 실은 이것은 개체가 아니다..
Delegate라고 하는 요상한 이름을 갖은 녀석이고 이것은
어떤 함수나 프로시져를 안전하게 접근하기 위한 중간장치라고 보면된다
즉 뒤에 매개변수로 전달하는 AddressOf TableRowChanged 에서
TableRowChanged라는 프로시져에 접근시키는 역할을 해주는 것

뭐가..이렇게 복잡허냐...!@# 라고 하는 상황이 될때..
에이..어려워..때려치워..하는 경우와
반드시 이놈들을 알아내서 내 마음대로 활용할꺼야..하는 경우 ..두개의
경우에서 첫째것을 선택하면 인생이 재미없다

아무튼 그냥 Delegate는 중간 고리역할만 해주는 그런 것이니..
당분간은 그냥 흠..Delegate라는 녀석도 있군..!!라고 알고 계셔도
아무 상관없다
위의 DataRowCahgeEventHandler라는 것이 내부적으로 Delegate로 선언이 되어
있다는 소리일뿐..내부적으로 뜯어보고 할 일이 없다
중요한 것은 이벤트프로시져를 VB.Net에서는 Event Hanler라고 부른다는 것
그래서
AddHandler라는 명령이 있는 것이다
Handler를 추가한다는 것..어디에 추가 하느냐..
AddHandler oTbl.RowChanged
즉 DataTable개체(oTbl)의 RowChanged라는 이벤트가 발생하는 부분에
Event Handler를 추가 한다는 소리이고
어떤 Handler를 추가 할 것이냐는 부분에서
AdHndler oTbl.RowChanged , New DataRowChangeEventHalder(AddressOf TableRowChanged)
빨강색 부분의 프로시져를 달아 맨다는 소리다
VBA에서 한다면 아마도 이렇게 되었을 것이다

개체.OnAction="TableRowChanged"

복잡하게 되는 이유는 엑셀이나 워드는 단순한 하나의 프로그램이지만
.Net FrameWork는 온갖 잡동사니 도구가 산같이 쌓여있는 중에서
골라서 개발자가 원하는 도구를 만들어서 사용하는 것이니..
세분화를 요하고 잘 구분하여 사용하여야 하고 이런 저런 것들의
충돌도 고려하여야 하니..좀 복잡한 소리를 할 뿐인것이다
아무튼..

Sub ....()
...
...
...oTbl = MakeNamesTable()
...AddHandler oTbl.RowChanged, New DataRowChangeEventHandler(AddressOf TableRowChanged)
...
...
End Sub

아래와 같이 작성된 이벤트르프로시져

Sub TableRowChanged(ByVal obj As Object, ByVal e As DataRowChangeEventArgs)
Dim dblX As Double = 0
For Each oRow As Data.DataRow In e.Row.Table.Rows
   dblX += oRow.Item(2)
Next
Me.txtSum.Text = dblX
Me.TextBox1.Text = Format(dblX / e.Row.Table.Rows.Count - 1, "#.00")
End Sub

와 같이 하면
DataGridView의 셀의 값을 바꾸면 DataGridView의 DataSource인
DataTable의 값도 바뀌고 이때 DataTable의 이벤트중의 하나인 RowChanged 이벤트에
위와 같이 설정된 TableRowChanged 프로시져가 호출되어
열의 총계와 평균을 계산하여 텍스트박스콘트롤에 계산된 결과를
전달하므로서 자동화가 된 것이다

***[LOG-IN]***