c#

  • c# List 잔기술들 1

    TextBox로 한꺼번에 출력하기 리스트의 아이템들을 TextBox에 출력할 때 한 줄씩 하면 느리다. 아래와 같이 한꺼번에 하면 빠르다. Environment.NewLine은 “\r\n”이라고 해도 된다. 전자는 후자를 호출하므로 후자가 더 빠르다. 아이템 순서 바꾸기 List에는 move 메떠드가 없다. ObservableCollection에는 move가 있지만 바인딩을 할 게 아니라면 List가 더 빠르므로 굳이 ObservableCollection를 쓸 필요는 없다. 어차피 move도 아래와 같은 방법으로 작동한다….

  • c# DataGridView 잔기술들 4

    행 삭제 이벤트의 버그 RowsRemoved는 행을 없애지 않고 DataTable을 연결만 해도 작동한다. 행을 지운 때에만 이벤트가 실행되게 하려면 UserDeletedRow를 써야 한다. RowTemplate.Height 설정 버그 비주얼 스투디오 17.4.2에서 디자이너로 DataGridView.RowTemplate.Height를 22로 설정하면 기본 값인 33이 계속 유지된다. 22로 설정하려면 코드로 작성해야 한다. Dictionary를 바인드하기 DataGridView에 바인드할 수 있는 것들은 리스트 형태의 객체들로 제한되어 있지만 Dictionary는 리스트…

  • 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++ 캐릭터 배열을 c# 배열로 마셜링하기

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