PROGRAMMING WORKSHOP

VB.Net | DataGridView 콘트롤_1

VB.Net을 슬글..슬금..할까...말까..접근하다가.. 이제 질문들도 하시고 하니..잘 해나가야겠다..
VB.Net 2010 Express버전은 MS사이트에 가면 무료다운로드 받을수 있으니까..
모두 준비하시고 달려 드시기 바란다

엑셀 프로그래밍과 윈도우 프로그램과 다른 것은
사용자의 눈에 접하는 인터페이스가 전혀 다르다
엑셀은 시원하게 펼쳐져있는 스프레드 시트이고 윈도우 프로그램은
엑셀 VBA에서 사용하던 UserForm 같은 것 하나 밖에 없다
이것 하나로 먹구 사는 프로그램이 윈도우프로그램이고 기타 일반적인
것들이 대개가 그렇다
그러니 사용하는 콘트롤들이 훨씬 VBA에서 사용하는 UserForm의 것보다
지능이 높고, 또 계속 높이려고 노력하는 것이다
VSTO에서 윈도우프로그램의 윈도우폼을 불러다 사용하겠다고 하는 것은
이런 지능 높은 콘트롤들을 사용하고 싶은 욕구때문에 그런 것이고
그렇게 하므로 엑셀프로그램을 좀더 비싸 보이게 만들기 위한 것이다
그러니 모두 도전하여 볼 만한 것이다
그런 컨트롤들을 VB.Net문법에서 벗어나서 실제로 하나,하나 만들어
보도록 하자..문법은 그때 그때 추가 설명하기로 하고..
가장 파워풀한 콘트롤 DataGridView콘트롤을 해보자..
가장 복잡하고 다양한 지능을 갖은 녀석이니..이것을 하면 딴것은
거져먹는다??라고 할 수 도 있을 것이다
스프레드시트같은 것이 없는 윈도우에서는 스프레드시트같이 만들수 있는
최선의 콘트롤인 것이다
그냥 윈도우 프로젝트하나 새프로젝트로 만들면 윈도우폼하나 달랑
나타난다
이 윈도우폼의 Load이벤트프로시져에 아래와 같이 작성하시고
실행 시켜보시기 바란다

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim sX() As String = {"AAA", _ "BBBBB", _ "CCCCCCC", _ "DD", _ "E", _ "GGGG"} Dim oGrid As New System.Windows.Forms.DataGridView oGrid.DataSource = sX oGrid.AutoSize = True oGrid.Font = New System.Drawing.Font("맑은 고딕", 9) Me.Controls.Add(oGrid) Me.AutoSize = True End Sub End Class

배열을 선언하는 것이 낯섫게 느껴질 것이다
위의 배열을 VBA에서 했다면
Dim sX As Variant
sX=Array("..","...","...","...")
와 같이 하지만 VB.Net에서는 위와 같이 하는 것도 한 방법이다
Dim sX() As String={"...","...","..."}

이렇게 선언한 배열을 혹시나 DataGridView에게 나타나게 할 수없을까??
하는 생각..DataGridView의 DataSource속성에 붙여 보고 싶다
그래서 해보는 것이다
우선 DataGridView하나 프로그래밍적으로 생성하고
Dim oGrid As New System.Windows.Forms.DataGridView
윈도우프로그램이라서 System.Windows.Forms 네임스페이스는 사용할 필요없지만
여러분들의 이해를 돕고 어느 NameSpace에 속한 것인지
자꾸 익숙하게 하려고 그러는 것이니 그렇게 아시고..

그리고 DataSource속성에 선언한 배열을 연결한다
AutoSize=True를 하면 내용에 따라서 알아서 크기가 결정되니까..편하고
폰트주고..
여기는 Me는 물론 해당윈도우 폼이고 이 윈도우폼도
AutoSize=True로 해주고

그런데 나타난 폼에는 엉뚱한 내용이 나타난다



문자의 갯수를 누가 카운트해달랬나????웃기는 녀석이다!!
이유없는 짓은 안한다..
DataSource속성에 연결된 것이 개체인줄아는 것이다
즉 개체(Object)를 연결하여야 한다
DataGridView의 첫째열에 나타나게 할 개체의 속성을 찾는다
마침 문자열의 디폴트개체가 Length인 것이다
그러니 Length을 열머리 이름으로 하고 내용을 각 배열의 요소로
전달된 문자의 갯수를 주욱 쏟아 놓은 것이다
아래와 같이 문자열정보의 Length속성을 읽어서 표현한 것이다
Dim sX As String="XXX"
sX.Length
그러니 DataGridView콘트롤은 자기가 힐일을 잘 한 셈이다
여기다 단순한 문자열로 구성된 배열을 딥다 붙여 놓은 우리가 잘못한 것이다
물론 배열을 붙여 댄 것은 잘못한 것이 없다..
배열의 요소가 개체여야 하는 것이다

아니 VB.Net에서는 문자열도 개체라고 했는데 뭔소리야..
그래도 갸우뚱하다..
아래의 그림과 같이 첫째속성이 Length였던 것이다



이래서 우리는 어쩔수 없이 VB.Net동네로 가려면
사용자정의 크래스에 능숙하지 않고는 진입할수가 없다
그래서 이번주 부터는 uno-weekly의 VBA의 크래스모듈이라도 우선
자꾸 활용하시게 하려고 한다
VBA에서 크래스모듈에 능숙하면 이쪽 동네에 와서도 별로
낯섫지 않으니까..

아래와 같이 해보면..

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim sX() As X = {New X("AAA"), _ New X("BBBBB"), _ New X("CCCCCCC"), _ New X("DD"), _ New X("E"), _ New X("GGGG")} Dim oGrid As New System.Windows.Forms.DataGridView oGrid.DataSource = sX oGrid.AutoSize = True oGrid.Font = New System.Drawing.Font("맑은 고딕", 9) Me.Controls.Add(oGrid) Me.AutoSize = True End Sub Private Class X Private name_ As String Sub New(ByVal sX As String) name = sX End Sub Property name() Get Return name_ End Get Set(ByVal value) name_ = value End Set End Property End Class End Class

사용자정의 크래스를 선언했다..
VB.Net에서는 그냥 하나의 크래스모듈에 여러개의 크래스를
만들어도 상관없다..아주 편리하다..
너무 어렵게 생각하지 말고 함수나 프로시져같이 VB.Net에서는 밥먹듯이
만들어서 사용한다는 것..!!!
이것으로 만든 개체를 배열에 넣고 DataGridView의 DataSource속성에
주면 첫째열을 바로 Property name이라고 된 속성값을 읽는 다는이야기다
그러니 name_값을 그대로 읽어 낸다
Class X의 속성인 name속성은 읽기(Get),쓰기(Set)이 모두 되는
속성이였다..
아무튼 좀 헷갈려도 하다 보면 자리 잡힌다..
VBA에서도 첨에는 뭐가 뭔지 몰랐지 않은가..!!
아래와 같이 원하는대로 나타났다



자..이제 맛을 보았다..아하!!!
사용자정의개체(크래스)도 작게 하나,하나 접근해 나가자
이제 좀 복잡하게 열을 추가하여 나가면 되겠다!!

DataGridView의 열을 추가하려면 크래스의 속성을 추가하면
된다
이제 Class의 활용을 하면 프로그래밍의 새로운 눈을 갖게 된다
.Net 환경에서는 모두 개체가 속성에 전달되기를 기다린다
그러니 VBA에서는 선택적으로 해도 되고 안해도 되지만
.Net FrameWork를 기반으로 하는 VB.Net에서는 필수이다

DataGridView는 사용자정의 개체의 것을 연결하기도 하지만
다양한 데이타베이스의 테이블과도 연결하고 편집하고 지능이
뛰어난 놈이니 차근 차근 이 콘트롤하나를 죽이면 개체지향의
특징적인 것을 새삼 느끼게 될 것이다

또한 이렇게도 DataGridView에 값을 넣을수 있다
이때는 열,행모두 개체를 만들어가면서 추가해나가는 것이다

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oGrid As New System.Windows.Forms.DataGridView With oGrid .AutoSize = True Dim oCol As New DataGridViewColumn oCol.Name = "TEST" Dim cell As DataGridViewCell = New DataGridViewTextBoxCell() With cell.Style .BackColor = Color.Black .ForeColor = Color.White .Font = New System.Drawing.Font("tahoma", 11) End With oCol.CellTemplate = cell .Columns.Add(oCol) Dim sX() As String = {"XXX", "YYY", "VVV", "ZZZ", "MMM", "QQQ"} With .Rows For Each sQ As String In sX .Add(sQ) Next End With .Font = New System.Drawing.Font("tahoma", 12) End With Me.AutoSize = True Me.Controls.Add(oGrid) End Sub End Class

또한 크래스생성없이도 할 수있다
좀 코드가 피곤해서 그렇지..하나,하나 순환해 가면서 입력해 나가는 것이다
DataSource속성에 한꺼번에 값을 전달하지 않고..
워크시트의 범위에 값을 넣듯히 하는 것이다
열을 생성하고, 셀을 생성하고, 행에다 추가하고..
또한 서식을 얼마던지 하고 위의 결과는 아래와 같다





***[LOG-IN]***