c# DataGridView 잔기술들 3

행 옮기기 행을 옮길 때 DataGridViewRowCollection.InsertCopy를 쓰면 새 행이 만들어져 들어간다. 아래와 같이 인스턴스를 복사한 뒤 현재의 것을 없애야 한다. 데이터 소스 바인드하지 않고 이용하기 간단한 테이블을 만들 때에는 굳이 데이터 소스를 만들어서 연결할 필요가 없다. 칼럼 iterate하기 DataColumn을 쓰지 않고 DataGridViewColumn을 쓰는 것에 유의한다. DataColumn은 DataTable의 칼럼이다. 디자이너 오류 디자이너로 칼럼을 만들 수 있지만…

c# DataGridView 잔기술들 2

행과 열 고정/해제하기 여러 행/열들의 하나를 고정하면 그 위/왼쪽의 것들까지 고정된다. 고정된 여러 행/열들 가운데 하나를 해제하면 그 아래/오른쪽의 것들까지 해제된다. 칼럼 헤더를 여러 줄로 출력하기 DataGridView.ColumnHeadersDefaultCellSytle.Layout.WrapMode는 작동하지 않는다. 버그 같다. ColumnHeader.Text가 길어서 Column.Width를 벗어나도 그냥 잘린다. ColumnHeader.Text 사이에 줄 바꿈 문자 ‘\n’을 넣으면 여러 줄로 출력된다. 마지막 행으로 스크롤하기 행이 추가되면 그 내용을 보기…

c# DataGridView 잔기술들 1

멀티뜨레드로 셀 값 쓰기 메인 뜨레드에서 DataGridView를 만들고 메인 뜨레드 아닌 뜨레드들에서 DataGridView의 셀 값을 쓸 때에는 델리게이트를 이용하지 않아도 된다. 행을 추가할 때에는 델리게이트를 써야 한다. 아래의 코드는 실행되지 않는다.

c# 메떠드 아규먼트로 밸류/레퍼런스 타입을 쓸 때의 차이

세 경우로 나눌 수 있다. 먼저 용어들을 정리한다. 호출을 하는 것은 caller이고 호출되는 것은 callee이다. 들어가는 값은 argument이고 인자라고도 한다. 받는 값은 parameter이고 매개변수라고도 한다. 한자어가 더 어렵게 느껴져서 그냥 영어를 쓴다. 패러미터를 수정해도 아규먼트가 변경되지 않는 경우 밸류 타입 아규먼트를 그냥 넘긴 경우다. 메떠드가 호출되면 아규먼트를 패러미터로 복사하여 이들 둘은 서로 다른 게 된다….

c# WndProc으로 윈도우즈 메시지 제어하기

WndProc 메소드 WNDPROC은 win32 api에 들어 있는 콜백 함수이며 .네트의 Control.WndProc 메써드로 wrap되어 있다. 다른 환경에서 이용되는 메써드 등을 자신의 환경에서 이용할 수 있게 가공하는 걸 wrap한다고 한다. ‘포장한다’는 뜻이다. 콜백 함수란 이벤트 실행 함수를 말한다. callback은 ‘답신’을 뜻한다. 내가 아무개에게 전화를 했는데 그가 받으면 용건을 말하고 끊으면 된다. 그러나 전화를 했는데 그가 없고 다른…

c# lock으로 멀티뜨레드 대이터 래이스 막기

대이터 래이스 아래의 예제는 일부러 data race가 일어나게 한 거다. 동시에 두 개의 뜨레드에서 하나의 리스트에 대이터를 쓴다. 그 결과 리스트 값들은 듬성듬성 빠져 있다. 하나의 뜨레드에서 쓰기 작업을 끝내기 전에 다른 뜨레드에서 덮어쓰기 때문이다. lock으로 동기화 리스트에 쓰는 부분을 아래와 같이 lock으로 둘러싸면 대이터 래이스는 일어나지 않는다. 먼저 lock에 다다른 리스트에 대한 쓰기 작업이…

c# 떠블 버퍼로 DataGridView 빠르게 출력하기

DataGridView 성능의 한계 DataGridView는 느리다. 모니터 한 화면 정도 채우는 셀들을 출력하는데도 한꺼번에 뜨질 않고 줄줄이 뜬다. 델파이에 비해 .네트의 일반적인 연산 능력이 떨어지는 건 모르겠지만 비주얼 처리는 주의를 기울이지 않아도 느껴질 정도로 느리다. 윈도우즈 폼즈도 느리지만 wpf는 더 심하다. 웹페이지 정도의 정적인 애플리케이션은 wpf로 예쁘게 만들 수 있지만 주식 차트처럼 빠르게 리프레쉬해야 하는 건…

c++ 캐릭터 배열을 c# 배열로 마셜링하기

아래 c++ 구조체 안의 캐릭터 배열을 c# 배열로 마셜링하는 데에는 UnmanagedType.ByValArray와 UnmanagedType.ByValTStr을 쓸 수 있다. UnmanagedType.ByValArray ByValArray를 쓰면 똑같이 캐릭터 배열로 바꾼다. c의 캐릭터는 ansi로서 1바이트를 차지하고 c#의 그것은 유니코드이며 크기가 2바이트다. 전자에서 한글을 표기하려면 두 개의 캐릭터들이 필요하다. 위의 c++ 예에서 구조체에는 한글 두 글자들만 들어갈 수 있으며 예를 들면 ‘가나\32(공백)’이다. 이걸 위의 c#…

c# 깊은 복사, 얕은 복사, 할당의 차이

객체는 밸류 타입과 레퍼런스 타입으로 나뉜다. 깊은 복사, 얕은 복사, 할당은 레퍼런스 타입에서만 문제되며 특히 얕은 복사와 할당이 문제된다. 깊은 복사 레퍼런스 타입 객체를 deep copy하면 refer하는 객체와 refer된 밸류가 모두 새롭게 만들어진다. 레퍼런스만 복사하는 건 쉽지만 밸류까지 복사하는 건 어렵다. 시리얼라이즈를 한 뒤 디시리얼라이즈를 하던가 iCloneable 인터페이스를 써야 한다. 이런 문제는 주로 클래스를 복사할…