PROGRAMMING WORKSHOP

VB.Net | DataGridView 콘트롤_2, 콤보상자,체크박스삽입

엑셀에서 유효성검사를 사용하여 셀에 콤보상자와 유사한 목록을
삽입하여 사용하기도 하였다
DataGridView도 역시 콤보상자를 삽입한다
아주 가장 간단하게 만들어 보자

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oDGV As New DataGridView Dim oCBOCol As New DataGridViewComboBoxColumn Dim oBinding As New BindingSource oBinding.Add("TYPE_A") oBinding.Add("TYPE_B") oBinding.Add("TYPE_C") oCBOCol.HeaderText = "Type" oCBOCol.DataSource = oBinding oDGV.Columns.Add(oCBOCol) oDGV.Font = New System.Drawing.Font("맑은 고딕", 9) oDGV.AutoSize = True Me.Controls.Add(oDGV) Me.AutoSize = True End Sub

위와 같이 하고 실행하면 아래의 그림과 같이 만들어진다
테이블에 열을 콤보상자열만 하나 삽입해 본것이다



개체를 만들어서 상위개체에 추가 시키고
개체를 만들어서 집합체에 추가 시키고..
자꾸하다보면 개체의 재미있는 조립과정이 즐거움이 될 것이다
완전이 아이들 레고장난감조립하듯히 해 나가는 것이다
개체는 개체나름대로의 성질머리가 있고 이것을 이리저리 다루어서
모양도 내고 기능도 추가하고
엑셀에서 위와 같은 셀상에 콤보상자와 유사한 것을 삽입하려면



위에서 BindingSource라고 하는 것이 있다
BindingSource는 DataSorce와 중간역할을 하는 것으로서
다양한 데이타정보의 연결정보를 BindingSource가 갖고 있고
이것을 각 콘트롤의 DataSource에 연결하면 되는 편리한 녀석이다
BindingSource를 코딩으로 하지 않고 마우스로 끌어다 놓는다면

아래의 그림과 같이 폼에 끌어 다 놓으면 폼이 아닌,
아래의 별도의 회색트레이에 표시가 된다



이 곳에 표시되는 것들은 폼상에 나타나는 것들이 아니고
폼의 각종콘트롤들을 위한 지원개체들이 이곳에 있게 된다
물론 위와 같이 프로그램적으로 생성한다면 그림과 같은 짓은
필요없다..
개념을 설명하기 위하여 일부러 끌어다 놓아 본것이다
그리고 바인딩소스아이콘을 선택후 속성창의 DataSource를
데이타베이스에서 갖여 오던..사용자정의개체를 갖여 오던
..(이 부분은 차근차근 DB등을 이야기 하면서 나와야 할 일이다)
이렇게 끌어다 놓은 DataBinding은 DataSource속성을 갖고 있는
모든 콘트롤에 연결할 수 있게 되는 것이다

이것을 마우스로 끌어다 놓지 않고 프로그래밍적으로 만드는 것이
바로 아래와 같이 New로 BindingSource개체를 생성하는 셈이다
Dim oBinding As New BindingSource
oBinding.Add("TYPE_A")
oBinding.Add("TYPE_B")
oBinding.Add("TYPE_C")

Add메소드는 DataSorce없이 간략한 목록의 경우 추가하게 되어있는 것이다
물론 DataGridView의 콤보상자에 직접 넣을수도 있으나
다양한 방법을 보기 위하여 법썩을 떨고 있는 것이다
그래서 좀 헷갈릴 것이지만..엑셀도 첨 할때 헷갈리다가 결국에는
자리가 잡히듯이 이것도 잡힌다..
헷갈림은 이유가 너무 다양한 접근방법이 있어서 헷갈리는 것이다

만약 트레이에 BingingSource를 끌어 다 놓았다면
위의 내용을 아래와 같이 할 수 있을 것이다
끌어다 놓은 BindingSource가 이름이 BindingSource1 이라고 한다면
이미 개체생성이 된 셈이니까..
New하여 개체생성을 할 필요가 없이 그냥 아래와 같이 추가시키면 되겠지
BindingSource1.Add("Type_A")
BindingSource1.Add("Type_B")
BindingSource1.Add("Type_C")
라고 한후 연결하고 싶은 콘트롤의 DataSource속성에 BindingSorce1을
주면 된다(아래 쌤플화일에 만들어 놓았으니 보시면 이해가 될 것이다)

모든 마우스로 끌어다가 만드는 것들이 프로그래밍적으로 처리가 가능한 것
코딩에 신이 들리면 그냥 프로그래밍적으로 하는 것이고
그렇지 않으면 마우스로 끌어다가 놓는 것이고..
아무튼 BindingSource라는 콘트롤도 끌어다 놓아도 좋고
코딩을 하여도 좋고..물론 이곳에서 떠드는 것은 프로그래밍적인 것을
지양하지만..상황에 따라서 적절히 섞어가면서 하면 되는 것이고
항상 속성창을 잘 관찰하시면서 자신이 몰랐던 유용한 것이 없나
탐구적인 것이 좋다
모든 개체는 속성창속에 개체의 재산이 죄다 들어 있다는 점!!
잊지 마시고..
프로그래밍의 개체들은 있는 것 다 까서 보여주려고 하지
꼼수를 쓰지 않는 정직한 아이들이다

바인딩이라는 개념은 배열을 연결하던..
개체를 연결하던 아무튼 정보뭉치를 사용자가 편리하게 보고 싶어하는
콘트롤에 쏟아 붇기 위한 작업을 하기 위한 것이다
지금 이곳에서 컨트롤로 가볍게 시작하지만 종국에는
데이타베이스와 연결하는 파워를 즐기기 위한 것이니
차근 차근 보시면서 오시고 이해가 안되는 것이 있으면 질문 서슴치 마시고

다음은 체크박스를 넣는 것을 해보자
아래의 그림과 같이 DataGridView에 체크박스가 DataSource상에
True,False정보(Boolean값)이 있으면 자동으로 그려진다



체크박스는 억세스테이블시트에 자동으로 나타나는 것과 마찬가지로
보시면 된다

자..좀 짜증나는 부분이지만 반드시 알아야 하는 부분..
크래스모듈로 정보의 구조를 하나 만들어 보자
정보간의 구조적으로 안정된 관계를 유지하는 틀을 만드는것..
도대체 왜 이런 정보의 틀(Structure)을 구성하는 건가??
그냥 데이타베이스에서 정보를 쭉 끌어다가 붙이면 되지 않나?
아래의 그림과 같이 데이타베이스에서 직접정보를 갖여다가
DataSource를 만드는 경우는 DataBase라고 쓴 것을 선택하고
지금 여기에서 간단하게 만들어 보려는 크래스모듈로 만드는 개체는
그림의 Objects 를 선택하고 연결하는 부분인 것이다



물론 그림의 마우스로 끌어다가 만드는 것도 있고
프로그래밍적으로 만들어서 연결하는 것도 있고
결국은 이것 저것 같이 편리하게 사용하게 된다
데이타타입이 Objects인 Data Source를 만드는 것을 보자는 것이다

간단한 개요의 그림을 보면



이렇게 Objects라는 Data Source타입의 개체를 만들기 위하여
크래스모듈을 사용하게 되는 것이다
왜 이렇게 복잡하게 자꾸하냐구..
정보를 데이타베이스써버에서 무식하게 죄다 갖여 오는 경우는 없다
쓸만큼 갖여다가 사용하고자 하는 용도로 정보구성을 한다는 것..
이것이 프로그래머들이 하여야 할 일들인 것이고
그래서 나름대로 구성하는 정보의 구조가 필요하게 되는 것이다

데이타를 받는 콘트롤이 DataSource로 이해하고
특히 중간역할을 하는 BindingSource콘트롤이 DataSource로 이해하는
사용자정의 개체(User Defined Object)를 만드는 것을 차근 차근 해보자

Class MyClass
...
...
End Class

Sub 프로시져나 Function 프로시져를 시작할때와 같다

Sub MySub
...
...
End Sub

Function MyFunction
...
...
End Function

그리고 안의 내용물은 아래와 같다

Class MyObj
   Public iX As Integer
   Public iY As Integer
   Public iZ As Integer
   Function Result()
      Return iX*iY
   End Function
End Class

라고 하면
Dim oX As New MyObj 라고 선언후
oX.iX=100
oX.iY=2
MsgBox oX.Result
라고 하면 결과값 200을 받아주는 일을 한다
이것도 사용자정의 개체인것이다
별것도 아니다..
그런데 위와 같이 만든 사용자정의개체는 콘트롤들이 이해하지 못한다
위와 같이 내부변수를 Public으로 선언하여
개체명에서 직접 접근하는 변수는 속성이라고 하지 않고
필드(Field)라고 한다
위와 같이 Public으로 선언하는 것은 개체를 사용하는 의미가 없다
그냥 코드를 간결하게 하고 싶으면 위와 같이 Public으로
관련된 변수를 모아서 편리하게 관리한다는 차원에서
사용되는 개체일수는 있어도 다른 콘트롤들과 적극적 관계를
갖으려면 제대로 된 속성(Property)를 사용하여야 한다

그래야 크래스의 근본목적인 Encapsulation을 유지한다
모든 데이타는 감춘다는 의미가 필요한 것이다
가장 근본적인 것만 외부에 노출하고 잡다한 정보는 감춘다라는 근본컨셉을
유지하도록
위의 것을 좀더 적극적으로 표현한다면

Class myObj Private iX As Integer Private iY As Integer Function Result() Return iX * iY End Function Property X() Get Return iX End Get Set(ByVal value) iX = value End Set End Property Property Y() Get Return iY End Get Set(ByVal value) iY = value End Set End Property End Class

속성은 Get ..받아내는 즉 ReadAble 속성과
Set...써주는 즉 Writable속성두가지다
그러니 위의 Property X()속에는 Get과 Set이 한쌍으로
들어있다
그런데 실은
Property X 라고 친후 엔터키를 치면 아래와 같이 빨강색 부분은 자동입력된다
일일이 자판을 칠 필요가 없다는 점..안해보신분은 꼭 해보시고
개체와 친해져야 한다는 점.!! 잊지 마시기를..

Property X()
Get End Get Set(ByVal value) End Set End Property

자동입력된후
Get 은 읽어내는 속성이니까 Return 값을 입력하고
Set 은 쓰는 속성이니까..
Set(ByVal Value)라고 전달받은 값이 Value매개변수에 자동으로
표현되었으니 숨겨진 내부변수에 Value를 전달하여
개체내부에서 갖고 사용하면 되는 것이다

위에서 속성이 ReadOnly라는 것 ..읽기 전용이라는 것을 하나만 더해보자
위에서 Funcion Result()같은 것은 매개변수도 전달하지 않는
간단한 함수이다
이것은 읽기전용속성의 대상이 될 만하다

ReadOnly Property Result()
    Get
       
    End Get
End Property

위와 같이 ReadOnly Property Result 라고만 입력하고 Enter키를
치면 빨강색은 또 자동으로 입력된다
물론 그 속에 Return iX*iY 와 같은 결과표현만 입력해주면 되겠다
또 많은 키워드가 있지만 나중에 또 상황에 따라서 이야기 하면서
크래스모듈을 일반함수작성하듯이 되도록 하자
참 하나더..VBA에서 습관이 되어 Return값의 Type을 주는 것을
잊어먹지만 항상

Property Result As Long

와 같이 As Type명까지 입력하여 주는 습관을 갖는 것이 좋다
또한 크래스가 갖고 있는 속성,메소드(함수나 프로시져),이벤트등을
모두 크래스의 Member들이라고 통털어 부른다

왜 이렇게 복잡한 짓을 하지..
위의 예문은 그냥 예를 들기 위한 것이지만
속성값을 주고 받으면서 많은 일을 할 수 있고..
또한 위와 같은 정식 속성명으로 표현되어야 다른 개체에서
정상적인 개체로 취급을 해준다는 점..
특히 위의 그림에서 Object타입 DataSource로서 취급을
받을수 있다는 것을 설명하기 위하여 그림에서 Object를
DataSource로 하겠다는데 이 Object 가 무언지를 알기 위하여
어디선가 이야기 한 것 재차 반복이다
반복적으로 이야기를 해도 나쁠 것 없으니 잘 가름하면서 보시면 좋겠다

즉 DataSource로서 구색을 갖추는 Object를 만드는 요령을
보는 것이다
어떤 정보떼거리를 WindowForm의 어떤 콘트롤의 DataSource로
활용한다!!목적을 이 것 하나만 갖고 Object를 보도록 해보자
과연 위와 같이 요상하게 만든 것이 어떻게 DataSource가 된다는 것인지..#@$

데이타소스로서의 Object는 하나의 데이타모델링을 한다고 할 수 있다
아래와 같이 데이타만 처리하는 크래스모듈을 하나 만든다

Private Class Member Private sName_ As String Private bMember_ As Boolean Private sCategory_ As Category Public Sub New(ByVal sCategory As Category, ByVal sName As String, _ ByVal bMember As Boolean) sCategory_ = sCategory sName_ = sName bMember_ = bMember End Sub Public Property Category() As Category Get Return sCategory_ End Get Set(ByVal Value As Category) sCategory_ = Value End Set End Property Public Property Name() As String Get Return sName_ End Get Set(ByVal Value As String) sName_ = Value End Set End Property Public Property Member() As Boolean Get Return bMember_ End Get Set(ByVal Value As Boolean) bMember_ = Value End Set End Property End Class

복잡해 보이는 것 같지만 찬찬히 보면 쥐뿔도 아니다..
속성이란 우리가 흔히 변수에 값을 전달할때

Dim sX As String
sX="홍길동"

이라고 표현한다
그런데 위의 내용을 아래와 같이 만들어서 사용하는 것이다

Private _sX As String
Property sX() As String
Get
Return _sX
End Get
Set(ByVal Value As String)
_sX = Value
End Set
End Property

그리고 속성이라고 부른다..
아니..뭣땜에 이렇게 복잡하게 하냐..결국은 _sX값이 그값이 그 값 아닌가???
정보의 보호라는 의미가 있는 것이다
Get이나 Set이라는 작은 프로시져내에서 들어오고 나가는
정보를 통제할 수 있는 장치가 만들어진 셈인 것이다
값을 빼가려고 할때..만약 내부적으로 그 값에 해당 하는 것이
어떤 조건에 삐딱하면 까칠하게 통제 할 수 있고
들어오는 값도 어떤 설계된 조건에 맞지 않으면 들어오지 못하게
하는 셈이다
그리고 DataSource로서의 개체로서는 또다른 약속된 기능들이
있으니 차차, 알아가게 될 것이고
알면 알수로고,,,오호..그 놈참 소리가 나오게 되는 장치들인것이다

위와 같이 정보를 담을 개체를 하나 만들고(데이타 모델링)
이것을 버튼을 크릭할때 위의 크래스로 개체들을 만들게 된다
아래와 같이

Dim oDGV As New DataGridView----DataGridView개체 만들고

위의 DataGridView에 사용할 DataSource용 개체를 만든다

Dim oList As New List(Of Member)----------집합체..List(Of Member)라고
하는 (Of Member)는 (Of T) 즉 정보의 Type..이 Member크래스모듈에서
만들어 내는 개체를 집합적으로 관리하겠다는 집합체 인 것이다
VBA의 Collection개체의 Net.FrameWork의 발전된 개체라고 생각하시면 좋겠다

oList.Add(New Member(Category.대학생, "고등어", True))
oList.Add(New Member(Category.주부, "꽁치", True))
oList.Add(New Member(Category.대학생, "망둥어", False))
oList.Add(New Member(Category.직장인, "꼴뚜기", True))
oList.Add(New Member(Category.초등학생, "문어", False))
oList.Add(New Member(Category.중학생, "숭어", True))
oList.Add(New Member(Category.고등학생, "오징어", True))
oList.Add(New Member(Category.직장인, "낙지", False))
oList.Add(New Member(Category.초등학생, "쭈꾸미", False))

위의 문법은 아래의 것의 단축적 표현이다

Dim oX As New Member
oX.Category=Category.대학생
oX.Name="고등어"
oX.Member=True
oList.Add oX

위와 같이 하여 만들어낸 정보의 개체를 DataGridView의 DataSource에 준다

oDGV.DataSource = oList

위와 같이 전달하면 3번째 버튼의 작업에서 Category열이 그냥 텍스트박스이지만
조금 코딩을 추가한 4번째 버튼의 작업은
아래와 같은 그림이 된다



좀더 자세한 설명은 쏘스화일 코드에 추가 설명하였습니다
실행해 보시고..
특히 4번째 버튼의 내용을 잘 살펴보시고
열거상수를 콤보상수의 목록으로 끌어다가 사용하는 것등을
잘 눈여겨 보세요!!
첨에 좀 까칠하고 어렵더라도 도전의 파워를 놓치지 마시기를..!!

***[LOG-IN]***