데이터 바인딩
데이터 바인딩(Data Binding)이란 데이터 소스와 UI 컨트롤을 서로 연결하여 한 쪽이 변하면 다른 쪽도 자동으로 변하게 만드는 기술이다.
-
사용 이유: 과거에는 for 문을 돌려 리스트의 내용을 하나하나 텍스트 박스나 라벨에 직접 집어넣었으나, 데이터가 수만 건이 되면 코드가 복잡해지고 관리도 불가능해지는 문제가 생김에 따라 이 과정을 자동화하는 데이터 바인딩이 필요해졌다.
-
중간 관리자: WinForm에서 데이터 바인딩을 할 때 BindingSource 클래스를 사용하며, 데이터 소스와 컨트롤 사이에서 중개자 역할을 한다.
-
정렬(Sorting) 및 필터링(Filtering): 실제 데이터를 건드리지 않고 화면에 보이는 순서만 바꿀 수 있다.
-
커서 관리(Position Management): 현재 선택된 행이 몇 번째인가를 관리한다.
-
통화 관리(Currency Management): 여러 컨트롤이 동일한 데이터를 바라볼 때 동기화를 유지한다.
-
컨트롤 심화 활용
DataGridView는 WinForm에서 엑셀과 같은 기능을 앱 안에 구현할 수 있게 해준다.
-
주요 속성 및 설정: 자주 사용되는 속성은 다음과 같다.
-
AutoGenerateColumns: 기본값으로 설정하면 데이터 소스의 속성명대로 열을 자동 생성한다.
-
SelectionMode: 행 전체 선택(FullRowSelect) 기능이 많이 쓰인다.
-
ReadOnly: 사용자로부터 데이터 수정을 막을지 결정한다.
-
VirtualMode: 수백만 건의 데이터를 다룰 때, 현재 화면에 보이는 부분만 메모리에 올려 성능을 극대화하는 모드이다.
-
-
데이터 변경 알림: 메모리 내의 객체 값을 바꿨는데 화면이 갱신되지 않는 경우가 많다. 이때는 데이터 클래스에 INotifyPropertyChanged 인터페이스를 구현해야 한다. 이는 UI 컨트롤에 값 변경 시 다시 그리라고 신호를 보내는 과정이다.
GDI+ 그래픽 프로그래밍
컨트롤만으로는 부족한 차트, 다이어그램, 이미지 편집 기능을 구현하려면 직접 그림을 그려야 한다. .NET에서는 이를 위해 GDI+(Graphics Device Interface Plus)를 사용한다.
-
Graphics 객체와 Paint 이벤트: 그림을 그릴 때 가장 중요한 규칙은 아무 때나 그리면 안된다는 것이다.
-
Paint 이벤트: 윈도우 창이 가려졌다가 다시 나타나거나, 크기라 변할 때 운영체제는 화면을 다시 그리라고 명령한다. 이때 발생하는 것이 Paint 이벤트이다.
-
e.Graphics: Point 이벤트 인자를 통해 전달받는 이 객체가 바로 캔버스이다.
-
Invalidate(): 코드로 그림을 다시 그리게 강제하고 싶을 때 사용한다. 직접 Paint 이벤트를 호출하는 것이 아닌, 시스템에 요청하는 방식이다.
-
-
그리기 도구: 그리기 도구는 다음과 같은 종류가 있다.
-
Pen: 선을 긋는 도구이다. 두께, 색상, 점선 여부를 결정한다.
-
Brush: 면을 채우는 도구이다. 단색, 그라데이션, 해치 패턴 등이 있다.
-
Font: 글자를 그릴 때 사용한다.
-
-
좌표 계의 이해: 컨트롤의 좌표 계는 다음과 같다.
-
2차원 좌표: 컨트롤의 왼쪽 상단 끝이 기준점이며, (0, 0) 구조를 따른다.
-
단위: 기본적으로 픽셀(Pixel) 단위이다.
-
더블 버퍼링
그래픽을 많이 그릴 때 화면이 깜빡거리는 현상(Flikering)이 발생한다. 이는 화면에 그리는 과정이 사용자 눈에 실시간으로 보이기 때문이다.
-
원리: 메모리 상의 보이지 않는 곳(Back Buffer)에 그림을 완성한 후, 완성된 그림을 한 번에 화면(Front Buffer)으로 복사한다.
-
설정: Form이나 컨트롤의 속성 창에서 DoubleBuffered 속성 기본값 한 줄만 설정해도 대부분의 깜빡임 현상이 사라진다.
이미지 처리와 리소스
UI 내 이미지 처리와 리소스 관리 방법은 다음과 같다.
-
비트맵(Bitmap) 클래스: 픽셀 단위로 이미지를 조작할 때 사용한다. GetPixel(), SetPixel() 메소드로 필터 효과를 만들 수 있다.
-
리소스 파일: 이미지, 아이콘을 프로젝트 파일에 포함시켜 배포 시 이미지 파일이 누락되는 사고를 방지하낟. Properties.Resources.MyImage 형태로 쉽게 불러올 수 있다.