PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | DataGridView,Excel,TextFile,Multi Projects

Resources 폴더에 자원화일추가

프로젝트의 Resource 폴더에 자원추가하는 작업은 항상 필요한 것이다
예를 들어서 텍스트화일이나, 그림화일들을 프로젝트에서 항상 사용하게 하려면
자원에 추가시킨다
이 자원만 관리하고 있는 폴더가 Resource 폴더이다
프로젝트속성화일을 열어서..



안드로이드앱을 개발하던,윈도우폼을 하던,프로젝트마다,
자원홀더는 항상 필요하다
텍스트화일에 데이타를 담아서 자원으로 보관하고
윈도우폼에서 DataGridView상에 이 데이타가 나타나게 하자

TableLayoutPanel,DataGridView,Button

폼에 콘트롤을 만들어 넣을때,
컨테이너 역할을 하는 콘트롤들이 많아서
컨트롤을 배치하는데 많은 도움을 준다
아래의 그림과 같이 콘트롤을 폼이 로딩되면서 배치해보자



DataGridView는 데이타를 담지 않으면 그냥 빈탕으로 나타난다
버튼을 크릭하여 DataGridView에 정보를 담으면 나타나게 하자

Dim WithEvents oBtnLoadData As Button
Dim WithEvents oBtnToXL As Button
Dim oDV As DataGridView

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
	'' 폼의 캡션을 써주고
	Me.Text = "TextFile->DataGridView->Excel"
	'' 사용할 폰트개체를 만들고
	Dim oFont As New Font("맑은 고딕", 10)
	''폼의 ClientSize를 적당히 정해주고
	Me.ClientSize = New Size(420, 310)
	''전체콘트롤을 담을 콘테이너 콘트롤중의 하나인 TableLayoutPanel 콘트롤을 생성하고
	Dim oContainer As New TableLayoutPanel
	''TableLayoutPanel콘트롤의 속성을 처리한다
	With oContainer
		''Dock 속성을 폼에 꽉차게 하기 위하여 Fill로 주고
		.Dock = DockStyle.Fill
		''행은 두개로 하고, 하나는 DataGridView콘트롤, 
		''다른 하나는 또다른 TableLayoutPanel콘트롤을 담는다
		''두번째 TableLayoutPanel 컨트롤은 Button콘트롤 2개를 담는다
		.RowCount = 2
		''행의 갯수는 1개
		.ColumnCount = 1
		''행의 높이등을 정하는 것은 RowStyle개체를 사용한다
		''RowStyles집합체는TableLayoutPanel의 행의 갯수와 같다
		''즉 하나,하나의 행의 Style을 서식하기 위하여 RowStyle개체를 사용하는 것
		.RowStyles.Add(New RowStyle(SizeType.Absolute, 260))

		''DataGridView콘트롤을 생성한다
		oDV = New DataGridView
		''DataGridView의 Dock 속성은 꽉차게 ..Fill
		oDV.Dock = DockStyle.Fill
		''폰트 서식을 폰트개체로 주고
		oDV.Font = oFont
		''컨테이너 컨트롤에 담을 컨트롤은 해당 콘테이너의 Controls 집합체에 추가 한다
		.Controls.Add(oDV, 0, 0)
		''Padding 속성은 테두리의 공간을 띄워주어 보기 좋게 하기..
		''Padding 속성의 타입은 Padding개체이니, Padding개체를 만들어준다
		.Padding = New Padding(6)
	End With

	''Button 콘트롤을 담을 두번째 컨테이너 TableLayoutPanel 콘트롤 생성하여
	Dim oButtonContainer As New TableLayoutPanel
	''TableLayoutPanel콘트롤의 서식
	With oButtonContainer
		''열을 두개로 하고
		.ColumnCount = 2
		''Dock 속성은 부모컨트롤에 꽉차게 Fill
		.Dock = DockStyle.Fill
		''행은 한개로하고
		.RowCount = 1
		''열의 폭이나 열에 관련된 속성을 처리하기 위하여..
		''열의 갯수만큼 순환하면서(여기에서는 열이 2개, 2번순환)
		For iX As Integer = 0 To .ColumnCount - 1
			''순환된 열의 ColumnStyle 개체를 만들어서 
			''TableLayoutPanel 콘트롤의 ColumnStyles 집합체에 추가한다

			'Dim oStyle As New ColumnStyle
			'oStyle.SizeType = SizeType.Percent
			'oStyle.Width = CSng(100 / .ColumnCount)
			'.ColumnStyles.Add(oStyle)

			''위의 표현은 아래와 같이 하여도 좋고 아래와 같이 한줄로 표현해도 좋고
			.ColumnStyles.Add(New ColumnStyle With {.SizeType = SizeType.Percent,
							  .Width = CSng(100 / oButtonContainer.ColumnCount)})

		Next
	End With
	''부모 컨테이너에 자식 컨테이너 컨트롤을 추가 한다
	oContainer.Controls.Add(oButtonContainer, 0, 1)

	'' 첫째 버튼 생성하고
	oBtnLoadData = New Button
	oBtnLoadData.Text = "Load Datas"
	oBtnLoadData.AutoSize = True
	oBtnLoadData.Left = 6
	oBtnLoadData.Font = oFont

	'' 두번째 버튼 생성하여
	oBtnToXL = New Button
	oBtnToXL.Text = "To Excel"
	oBtnToXL.Left = 150
	oBtnToXL.AutoSize = True
	oBtnToXL.Font = oFont

	''부모 컨테이너에 두개의 버튼을 추가한다
	''이때 Add 메소드가 어떤 행과 어떤 열에 추가할 것이지를 매개변수를
	''주는 것이 다른 컨트롤에 추가하는 것과는 다르다
	''Add(oBtnLoadData, TableLayoutPanel 열위치,TableLayoutPanel 행위치)
	oButtonContainer.Controls.Add(oBtnLoadData, 0, 0)
	oButtonContainer.Controls.Add(oBtnToXL, 1, 0)
	Me.Controls.Add(oContainer)

End Sub

***[LOG-IN]***

My, DataTable,DataGridView,ToopTip

My 네임스페티스를 통하여 다양한 정보에 쉽게 접할수 있다
텍스트화일로 Resources홀더에 들어 있는 내용에 접근하여
아래와 같이 DataGridView에 테이블을 올릴수 있다

Private Sub oBtnLoadData_Click(sender As Object, e As EventArgs) Handles oBtnLoadData.Click
	''My 네임스페이스를 통하여 아래와 같이 
	''텍스트화일의 내용을 문자열로 갖여오고, 
	''문자열을 Split메소드를 활용하여 행별로 배열화하고..
	''My.Resources.SampleData.Split(vbCrLf) 
	''배열화된 내용을 ToList 메소드로 List(Of String)집합체로 변환시킨다
	Dim oDatas As List(Of String) = My.Resources.SampleData.Split(vbCrLf).ToList
	''DataGridView컨트롤의 쏘스로서 DataTable개체로 만들어야 하니까..
	''위의 집합체를 테이블로 받아줄 DataTable개체를 생성한다
	Dim oTable As New DataTable
	Dim iRow As Integer = 0
	'' DataTable의 각행의 개체타입이 DataRow개체이다
	''위의 List(Of String)집합체를 순환하면서 행별로 DataRoW개체를 만들어서
	''DataTable개체에 행을 추가하여 나간다
	Dim oDataRow As DataRow

	'' DataTable의 열만들기
	'' List(Of String) 집합체의 첫째행이 열머리정보이다
	''그래서 oDatas(0)이 첫째행 즉 하나의 문자열, 이것을 탭문자로 Split하여
	''배열화하고 배열화된 요소의 각각의 값을 열머리이름으로 하여 DataTable의 
	''열을 만들어서 하나의 DataTable의 구조를 만든다
	For Each sFld In oDatas(0).Split(vbTab)
		oTable.Columns.Add(sFld)
	Next

	''위에서 DataTable의 구조가 만들어졌으니
	'' List(Of String)집합체의 각각의 행을 순환하면서
	'' DataTable의 행을 만들어서 DataTable개체의 Rows집합체에  추가하면
	''정보가 완전히 DataTable 개체에 들어 간다
	For Each sRow In oDatas
		'' 하나의 행을 Trimg하여(앞뒤로 빈문자등이 있을수도 있으니까) , 빈문자열이 아니면
		''작업의 대상이 되는 행이다
		If sRow.Trim <> "" Then
			If iRow > 0 Then
				'' 열머리행을 제외하고 나머지 행은
				'' DataTable의 NewRow 메소드로 새로운 행개체를 만들고
				oDataRow = oTable.NewRow()
				''행개체의 ItemArray속성은 하나의 행의 정보를 배열로 직접받을수 있다
				oDataRow.ItemArray = sRow.Trim.Split(vbTab)
				''행개체가 채워진후 Rows 집합체에 추가한다
				oTable.Rows.Add(oDataRow)
			End If
			iRow += 1
		End If
	Next
	''DataGridView의 행머리는 보이지 않게 서식하고
	oDV.RowHeadersVisible = False
	''DataGridView의 DataSource속성에 위에서 만든 DataTable을 주면 된다
	oDV.DataSource = oTable
End Sub

그런데 위의 DataGridView에 담긴 정보는
날자나 단가등의 숫자타입을 문자열로 그대로 옮긴 것이다
실은 정보의 타입으로 바꿔서 처리하는 것이 정상적인 방법이다



버튼을 하나 더 만들어서
이버튼을 크릭하면 데이타타입을 구분하여 테이블을 만들어서
아래와 같이 작성하여 붙이도록 하자

Private Sub oBtnLoadDataDataType_Click(sender As Object, e As EventArgs) Handles oBtnLoadDataDataType.Click
	''텍스트화일을 살펴보고 해당 열의 타입을 구체적으로 주도록 한다
	''일자(날자,System.DateTime)|지역(문자열,System.String)|영업사원(문자열)|품목(문자열)|수량(숫자,System.Int32)|단가(숫자,System.Double)
	Dim oDatas As List(Of String) = My.Resources.SampleData.Split(vbCrLf).ToList
	''DataGridView컨트롤의 쏘스로서 DataTable개체로 만들어야 하니까..
	''위의 집합체를 테이블로 받아줄 DataTable개체를 생성한다
	Dim oTable As New DataTable
	Dim iRow As Integer = 0
	'' DataTable의 각행의 개체타입이 DataRow개체이다
	''위의 List(Of String)집합체를 순환하면서 행별로 DataRoW개체를 만들어서
	''DataTable개체에 행을 추가하여 나간다
	Dim oDataRow As DataRow

	'' DataTable의 열만들기
	'' List(Of String) 집합체의 첫째행이 열머리정보이다
	''그래서 oDatas(0)이 첫째행 즉 하나의 문자열, 이것을 탭문자로 Split하여
	''배열화하고 배열화된 요소의 각각의 값을 열머리이름으로 하여 DataTable의 
	''열을 만들어서 하나의 DataTable의 구조를 만든다
	For Each sFld In oDatas(0).Split(vbTab)
		Dim oCol As New DataColumn(sFld)
		Select Case sFld
			Case "일자"
				oCol.DataType = System.Type.GetType("System.DateTime")
			Case "지역", "영업사원", "품목"
				oCol.DataType = System.Type.GetType("System.String")
			Case "수량"
				oCol.DataType = System.Type.GetType("System.Int32")
			Case "단가"
				oCol.DataType = System.Type.GetType("System.Double")
		End Select

		oTable.Columns.Add(oCol)

	Next
	'' 단가와 수량을 곱하여 금액을 낸 열을 하나더 추가하여 만들자
	oTable.Columns.Add(New DataColumn("금액", System.Type.GetType("System.Double")))

	''위에서 DataTable의 구조가 만들어졌으니
	'' List(Of String)집합체의 각각의 행을 순환하면서
	'' DataTable의 행을 만들어서 DataTable개체의 Rows집합체에  추가하면
	''정보가 완전히 DataTable들어간다
	Dim oListForRow As List(Of String)
	For Each sRow In oDatas
		'' 하나의 행을 Trimg하여(앞뒤로 빈문자등이 있을수도 있으니까) , 빈문자열이 아니면
		''작업의 대상이 되는 행이다
		If sRow.Trim <> "" Then
			If iRow > 0 Then
				'' 열머리행을 제외하고 나머지 행은
				'' DataTable의 NewRow 메소드로 새로운 행개체를 만들고
				oDataRow = oTable.NewRow()
				''행개체의 ItemArray속성은 하나의 행의 정보를 배열로 직접받을수 있다
				'oDataRow.ItemArray = sRow.Trim.Split(vbTab)
				''행개체가 채워진후 Rows 집합체에 추가한다

				oListForRow = New List(Of String)
				oListForRow = sRow.Replace(vbCrLf, "").Split(vbTab).ToList


				For Each oCol As DataColumn In oTable.Columns
					Select Case oCol.ColumnName
						Case "일자"
							Dim oListDay = oListForRow(0).Split("-")
							oDataRow.Item("일자") = DateSerial(oListDay(0), oListDay(1), oListDay(2))
						Case "지역", "영업사원", "품목"
							oDataRow.Item("지역") = oListForRow(1)
							oDataRow.Item("영업사원") = oListForRow(2)
							oDataRow.Item("품목") = oListForRow(3)
						Case "수량"
							oDataRow.Item("수량") = CLng(oListForRow(4))
						Case "단가", "금액"
							oDataRow.Item("단가") = CDbl(oListForRow(5))
							 ''금액은 원본에는 없는 계산열을 만들어 붙인다
                             ''원본이 딸라값이지만, 여기에서는 생략하고 정수값만 짤라서 표현하게 서식된 값으로 
                            oDataRow.Item("금액") = Format(oDataRow.Item("수량") * oDataRow.Item("단가"), "#")
					End Select
				Next
				oTable.Rows.Add(oDataRow)
			End If
			iRow += 1
		End If
	Next
	''DataGridView의 행머리는 보이지 않게 서식하고
	oDV.RowHeadersVisible = False
	''DataGridView의 DataSource속성에 위에서 만든 DataTable을 주면 된다
	oDV.DataSource = oTable
End Sub
***[LOG-IN]***