PROGRAMMING WORKSHOP

.NetFrameWork | 작업을 위한 정보수집 도구

UNO-Weekly Add-In화일중에 Gantt챠트그리기 기능이 있다
이곳의 기능변경,추가작업을 하다가 나온 부속품을 하나 보도록 하자
Gantt챠트그리기는 작업스케쥴을 그림으로 표현하는 하나의 방법이다
어느 작업의 시작일자와 종료일자등은 워크시트에서 사용자로 하여금
입력을 받으면 된다
그런데 전체 프로젝트기간중 특정 기간이나 혹은 특정일을 작업에서
제외하고 싶은 것은 실무적으로 발생하는 일일 것이다
이것에 대한 정보를 사용자에게서 받아야 하는데
이것도 워크시트에서 하면 되겠지만, 시트가 너무 지저분해진다
.NetFrameWork에서 얻은 지식을 떡사먹으려고 있는 것이 아닌것..
또한 VSTO버전 추가기능 화일이니 당연히 .NetFrameWork의 기능은
마음대로 사용하면 되는 것이고
그런 목적으로 이 .NetFrameWork코너가 있는 것이지, 그냥
목적없이 학습하려고 있는 것이 아니라는 의미에서 weekly 추가기능화일에
포함된 부속품을 하나 보도록 하자



그림과 같이 DateTimePicker콘트롤에서 각각 시작일자와 종료일자를
선택하고 추가버튼을 크릭하면 DataGridView에 옮겨지게 한다



DataGridView에 정보행추가하기
DataGridView의 행머리를 더블크릭하면 해당 행을 삭제하기
적용버튼을 크릭하면 DataGridView의 정보를 프로그램에 저장하기 전에
빠른 날짜별로 정렬을 하는 것이 모든 일의 순서에 맞는다
그래서, DataGridView를 프로그래밍적으로 정렬하기
등을 해보도록 하자
그리고 .NetFrameWork을 정복하려면 어쩔수없는 필수적 크래스모듈을
만들고 크래스모듈로 만든 개체에 DataGridView의 내용을 저장하기
등을 하도록 한다

이 코너의 모든 것은 VSTO로 엑셀 추가기능 화일을 만드는 작업을
위한 것이라는 점도 잊지 말자!!

Deginger.vb모듈시트의 내용을 이곳에서 지워 버렸다
공연히 별것도 아닌 것을 복잡하게 생각하면 포기하실까바..

이 페이지에서 중요한 것은 윈도우폼에서 정보를 받아서
어딘가에 사용을 하려고 한다
그런데 정보가 하나의 셋트로 구성이 된다

[시작일자]
[종료일자]
[기간]
[중단사유]

라는 여러 개의 정보를 여러 셋트받아들이게 된다
이것을 변수에다 보관하자니 그냥 변수에 보관하려면..
배열을 사용하여야 하던가, 무슨 수를 써야 한다
이럴때 Class모듈을 사용하는 것은 .NerFrameWork에서는 기본적상식이다
VB.Net 에서는 일반 모듈시트에서도 크래스를 만들수 있고
별개의 Class모듈시트에 만들 수도 있다
그래서 참으로 편리하다
아래의 그림과 같이 프로젝트를 진행하면서 발생하는 정보와 정보를
다루는 프로시져(메소드)들을 하나의 크래스모듈에 몰아서 작성하면
찾아보기도 쉽고 코드관리가 참 천국이다



아래와 같이 Class모듈을 정말 간단하게 만든다

'   일반 모듈시트에 크래스모듈을 작성할 수 있다
Module modMain
    Public Const PROJ_NAME As String = "NetFrameWork.......UNO21.COM"

    '################ clsSpecialPeriod 크래스에서 발생하는 개체를
    '#                         보관하기 위한 집합체
    '###########################################################
    Public oSpecialPeriods As List(Of clsSpecialPeriod)
    ' 하나의 정보떼거리를 하나의 개체로 만들기 위한 크래스
    Public Class clsSpecialPeriod
        Public StartDate As Date     ' 시작날짜
        Public EndDate As Date       ' 종료날짜
        Public Duration As Integer   ' 중단기간
        Public EventName As String   ' 중단사유
    End Class
    '########################################
End Module

데이타타입이 List(Of T)라고 하는 것이 있다
T는 정보의 타입을 말한다
List(Of String)
List(Of Integer)
집합체인 것이다..VBA에서 Collection개체와 같다고 보시면된다
그래서 위에서
List(Of clsSpecialPeriod)
라고 하는 것은 clsSpecialPeriod크래스에서 생성되는 개체로
목록, 즉 집합체를 만들어서 갖고 있겠다는 변수인 셈이다
참으로 편리한 것이 이놈이다

요렇게 준비작업을 해놓고 폼을 열어서 정보를 받아서
이 크래스모듈에 정보를 담아서 집합체에 보관하면 두고,두고
잘 써먹게 되는 것이다

아래의 [추가]버튼을 크릭할때마다 우선 DataGridView에
정보들이 추가 되어 간다



Private Sub ButtonAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAdd.Click
    ' ### 중단사유 입력여부확인
    If Me.TextBox1.Text = "" Then _
    	 MsgBox("중단일자나 중단기간에 대한 설명이 필요합니다", , PROJ_NAME) : Exit Sub
    ' ### 시작일자와 종료일자 받아내고
    Dim datStart As String = Me.DateTimePickerFrom.Value.Date.ToShortDateString
    Dim datEnd As String = Me.DateTimePickerTo.Value.Date.ToShortDateString
    ' ###시작일자와 종료일자의 관계체크
    If DateValue(datStart) > DateValue(datEnd) Then _
     	MsgBox("시작일보다 종료일이 빠릅니다..확인후 재실행", , PROJ_NAME) : Exit Sub


    ' ### DataGridView콘트롤에 값 옮기기
    ' DataGridView 의 이미 등록된 행( DataGridViewRow 개체)들을 순환하면서
    '
    For Each oRow As Windows.Forms.DataGridViewRow In DataGridView1.Rows
        ' 이미등록된 날짜와 중복되는지 체크
        If DateValue(datStart) >= DateValue(oRow.Cells(0).Value) And _
        	 DateValue(datStart) <= DateValue(oRow.Cells(1).Value) Then
            MsgBox("시작일자가 입력된 기간내에 중복됩니다", , PROJ_NAME) : Exit Sub
        End If
        If DateValue(datEnd) >= DateValue(oRow.Cells(0).Value) And _
        	 DateValue(datEnd) <= DateValue(oRow.Cells(1).Value) Then
            MsgBox("종료일자가 입력된 기간내에 중복됩니다", , PROJ_NAME) : Exit Sub
        End If
    Next
    ' ### 위의 검증을 통과하면 DataGridView콘트롤의 Rows 개체(집합체)에
    '       새로운 행을 만들어서 추가  Add( 한꺼번에 각 열에 해당하는 값을 전달해도 되는
    '       편리함이 있다
    '       VBA에서 ParamArray로 여러개의 값을 전달하는 것을 기억하시면 된다
    Me.DataGridView1.Rows. Add(datStart, datEnd, Me.TextBox1.Text)
    '       텍스트박스 지우고 다시 텍스트박스 포커싱해주고
    Me.TextBox1.Text = ""
    Me.TextBox1.Focus()
End Sub

위와 같이 필요한 일정을 모두 DataGridView의 각행으로 추가한후
이렇게 수집한 정보를 다른 작업에서 활용하게 하기 위하여
[적용]버튼을 크릭하면 DataGridView가 갖고 있는 내용들이

' ### DataGridView의 정렬기능을 활용하여 정렬을 한다
'       오름차 정렬, 정렬대상이 될 열개체를 찾아서
Dim oCol As System.Windows.Forms.DataGridViewColumn
oCol = Me.DataGridView1.Columns(0)
'       DataGridView의  Sort메소드에 해당 열과 오름차,내림차를 지정하는
'                                            매개변수를 전달하면 된다
Me.DataGridView1.Sort(oCol, System.ComponentModel.ListSortDirection.Ascending)

' 이제 정보를 담을 사용자정의 집합체를 생성한다
modMain.oSpecialPeriods = New List(Of modMain.clsSpecialPeriod)
' DataGridView를 순환하면서 각행별로 
For Each oRow As System.Windows.Forms.DataGridViewRow In Me.DataGridView1.Rows
'  선언하였던 크래스모듈 clsSpecialPeriod 크래스에서 개체를 생성하여
'  개체의 각 속성(엄밀히 따지면 휠드)에 값을 전달하여
Dim oSpec As New clsSpecialPeriod
oSpec.StartDate = DateValue(oRow.Cells(0).Value)
oSpec.EndDate = DateValue(oRow.Cells(1).Value)
oSpec.Duration = DateDiff(DateInterval.Day, oSpec.StartDate, oSpec.EndDate) + 1
oSpec.EventName = oRow.Cells(2).Value
' 모두 값을 준후 이 개체를 위에서 선언한 집합체에 추가해나간다
' VBA에서 Collection개체에 개체를 추가하여 나가는 것과 같다고 보면 된다
modMain.oSpecialPeriods.Add(oSpec)

준비하였던 크래스모듈에서 개체를 생성하면서 집합체에
추가 하여 보관시키면
이 집합체를 다른 곳에서 떡을 해먹던..국수를 빼먹던
활용하게 되는 셈이다

uno-weekly에서는 이것을 Gantt챠트를 그릴때 각작업내용의
시작일자와 종료일자가 위의 중단기간 일정에 포함되는지를 찾아서
중단기간에 걸리면 각작업기간이 중단 기간만큼 확장되는 아주 중요한
역할을 하게 되는 셈이다

이 페이지를 통하여 DataGridView에 행단위로 값넣기,삭제하기,정렬하기
그리고 사용자정의 개체에 값을 전달하여 프로그램내부에 보관하기등을
하여 보았다, 특히 크래스모듈을 그냥 최소로 간단하게 위와 같이만
활용하여도 정보관리가 편리해 진다는 점!! 을
접수하시면 만족!!

***[LOG-IN]***