PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net |

LINQ| DataTable, DataGridView

기본은 본래가 습득하기가 지겹고, 지루하다
앞페이지까지 LINQ의 키워드를 살펴보느라고 지루했다
이제 .NetFrame Work의 다른 개체들을 조합하면서 실제적인
작업을 통해서 LINQ를 실제 활용을 해보도록 하자
그러면서, 긴가민가 했던 LINQ의 키워드들을 다시 리뷰하는 기회가 될것이다

WindowForm의 엑셀의 워크시트같은 역할을 해주는 컨트롤이 있다
이 컨트롤을 DataGridView라고 한다
그리고 컨트롤은 데이타를 제공해주지 않으면 허당이다
아무짝에도 쓸모없다
그래서 데이타를 연결해주어야 한다
배열을 전달해주던가, 아니면 집합체를 전달해주던가 하여야 하겠는데..
이런 집합체로서 또 다른 기발난 개체인 DataTable이라고 하는 개체가 있다
이것은 마치 엑셀의 보이지 않는 워크시트와 같은 역할을 한다
메모리상에 숨어서 정보를 제공해주는 DataTable이라는 개체..
ADO나 DAO를 해보신분들은 Recordset이라는 개체를 기억하실 것이다
이런 역할을 하는 개체이다
Recordset과는 또 다른 지능이 높은 개체가 DataTable개체이다
이것을 활용해 보도록 하고..
LINQ의 작업대상이 되는 것이 그동안은 단순한 정보였으나
완전히 테이블을 구조로 하는 데이타를 대상으로 LINQ의 본연의 작업으로
들어가게 된다

하나의 프로젝트에는 DataTable개체가 여러개 있을수 있을 것이다
DataTable을 모아서 갖고 있는 개체가 DataSet 개체이다
마치 DB서버상의 DataBase프로젝트를 메모리상에 똑같이 구축할수 있는
MS의 핵심 개체들이다
여기에서는 DataTable하나의 개체를 RunTime으로 만들어서
연습을 해보자



DataTable에 정보를 채우는 방법은 다양하다
여기에서는 런타임으로 정보를 만들어 넣어 보도록 하자
DataGridView 콘트롤을 폼에 그려 넣고,
속성같은 것은 디자인타임에 하나도 손대지 말고
버튼을 크릭하면 크릭이벤트에서 DataGridView의 DataSource속성에
연결할 DataTable을 아래와 같이 만들어 보자

 Sub makeDummyData()
 ''외부변수로 선언하여 둔 oTable에 새로운 DataTable을 생성한다
 ''아직은 아무것도 없는 빈탕이다
        oTable = New DataTable
 ''5번 순환하면서 열을 5개 만든다
 ''VB.Net에서는 항상 모든 집합체가 0부터 시작한다는 점을 
 ''VBA와 헷갈리지 않도록 한다
 ''4개의 열은 데이타타입이 String 타입으로 하고 
 ''마지막 열은 데이타타입을 Double타입으로 한다 
        For iX As Integer = 0 To 4
            Dim oCol As New DataColumn
            oCol.ColumnName = "Data_" & iX + 1
            Select Case iX
                Case 0, 1, 2, 3
                    oCol.DataType = GetType(String)
                Case 5
                    oCol.DataType = GetType(Double)
            End Select
 ''열을 만들면 역시 다른 집합체와
''마찬가지로 Columns집합체에 Add 하여야 유효한 테이블의 열이 된다
''이렇게 하여 테이블의 구조가 완성된 것이다 
            oTable.Columns.Add(oCol)
        Next
 ''이제 100개의 행에 가상정보를
 ''랜덤으로 만들어 넣는다
 ''이것도 역시 0에서 부터 시작하는 것 잊지마시고		
        For iRow As Integer = 0 To 99
 ''하나의 행을 생성할때는
 ''Table의 NewRow속성으로 만든다
 ''생성된 행에 5개의 셀에 값을 만들어 넣는다
 ''Cell는 Item이라는 속성으로 접근한다			
            Dim oRow As DataRow = oTable.NewRow
            For iX As Integer = 0 To 4
                Select Case iX
                    Case 0, 1, 2, 3
                        oRow.Item(iX) = Chr(Int(Rnd() * 26) + 65)
                    Case 4
                        oRow.Item(iX) = Int(Rnd() * 1000) + 1000
                End Select
            Next
 ''역시 만들어진 행도
 '' Table의 Rows개체에 Add하여야 유효하다
 ''이렇게 하여 외부변수에 DataTable이 하나 만들어졌다			
            oTable.Rows.Add(oRow)
        Next
 End Sub


위와 같이 만든 프로시져를 버튼크릭에서 DataGridView에 아래와
같이 연결한다

 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        makeDummyData()
        Me.DataGridView1.DataSource = oTable 
		
''시각적으로
''DataGridView에 만든 테이블이 나타났다
''이것을 Button2에서 크릭할수 있게 하여 LINQ로 만들어 놓은
''DataTable을 LINQ로 조건을 주고 휠터를 해서 
''두번째 DataGridView에 표현해 보도록 하자	
        Button2.Enabled = True
 End Sub

Button2를 크릭하여..
아래의 프로시져가 실행되면 휠터링이 끝나서
새로운 DataGridView에 채워 지게된다

 Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Try

'' LINQ에서 사용할 조건을 두개의 변수에 만든다
'' 하나는 어떤 값을 찾을지.. 	

            Dim sCriteria As String = Chr(Int(Rnd() * 26) + 65)
            Dim sFld As String = "Data_" & Int(Rnd() * 5) + 1

''DataTable을 직접 LINQ를 하면 안된다
''DataTable을 LINQ할수 있는 AsEnumerable 이라는 속성으로 
''Enumerable타입개체로 변환시켜서 사용하면 된다				
			
            Dim oQ = From Q In oTable.AsEnumerable
                    Where Q(sFld) = sCriteria
                    Select Q

''oQ을 DataTable에 직접전달할수 없으니
''다시 Enumerable개체의 CopyToDataTable속성으로
''DataTable개체를 하나 만든다	
					
            Dim oTblFilter As DataTable = oQ.CopyToDataTable
            Me.DataGridView2.DataSource = oTblFilter
            

        Catch ex As Exception
           
        End Try

 End Sub

oTable.AsEnumerable 와 같이 AsEnumerable을 입력할때 목록에 나타나지 않으면
아래와 같이 라이브러리 참조가 누락되었을수 있으니
참조시키고 하시면 된다



CLONE|LINQ없이 DataTable로 휠터를 할때

LINQ가 없다고 안되는 것은 하나도 없다
순환을 하던, 무엇을 하던 기본 프로그래밍테크닉으로 죄다 된다
단지 좀 불편 할 뿐인것이다
만약 위의 LINQ로 휠터를 하는 작업을
LINQ가 없다면 어떻게 할까...
당연히 DataTable이라고 하는 개체도 메소드를 갖고 있다
Select 메소드를 사용하면 휠터가 되는 것
엑셀에서 휠터를 사용하여 시트상에서 다양하게 하였던 기억이 날 것이다
마찬가지다
개체를 만들때는 기능을 다양하게 만들어 넣게 되어 있으니
당연히 DataTable로 작업이 가능하다
아래와 같이...

 Try
	''DataTable의 Select메소드를 사용하여 걸러낸 행을 
	'' DataRow타입의 배열로 받아낸다
	'' Table로 받아내는 것이 아니고..
	Dim oRow() As DataRow = oTable.Select("Data_1='A' or Data_2='C'")
	'' 새로운 Table을 만든다
	'' Clone메소드는 oTable의 데이타는 제외하고, 테이블의 구조만 카피하여
	'' 새로운 테이블을 만드는 것이다
	Dim oTableCopy As DataTable = oTable.Clone
	'' 이 새로만든 테이블에 배열로 휠터된 내용을 
	'' 새로운 행으로 추가하는 순환을 한다
	For iX As Integer = 0 To oRow.GetUpperBound(0)
		Dim oDataRow As DataRow = oTableCopy.NewRow
		For iQ As Integer = 0 To oTable.Columns.Count - 1
			oDataRow.Item(iQ) = oRow(iX).Item(iQ)
		Next
		oTableCopy.Rows.Add(oDataRow)
	Next
	'' 그리고 새로 얻어낸 DataTable을 DataSource로 사용한다
	Me.DataGridView2.DataSource = oTableCopy

	Label3.Text = "쿼리 조건" & New String(vbNewLine, 2) & "Data_1='A' or Data_2='C'"

Catch ex As Exception
	MsgBox("조건에 맞는 것이 없습니다")
End Try

***[LOG-IN]***