[c#] RichTextBox RTF(rich text format) 기본적인 이용 방법

TextBox는 메모장이고 RichTextBox는 워드패드다. 문자열에 스타일을 적용하려면 RichTextBox를 써야 한다. RichTextBox는 윈도우즈 차원에서 제공되는 것이며 .네트는 win32 api를 랩wrap하여 지원한다. 그러나 완벽하지는 않아서 높은 수준으로 이용하려면 직접 win32 api를 제어해야 한다. 스타일이 적용된 것은 rich text format이라 하며 줄여서 rtf라고 한다. 스타일을 제어하는 데에는 크게 세 가지 방법이 있다. 문자열을 입력하기 전에 스타일을 설정하기 스타일을…

c# 윈도우즈 폼즈의 form 잔기술들

폼 클래스의 위치 폼 클래스 코드는 네임스페이스에서 제일 위에 있어야 한다. 폼 클래스 코드 위에 다른 클래스 코드가 있으면 디자이너가 열리지 않는다. 디자이너는 파일의 첫 번째 클래스를 이용하여 작동하기 때문이다. 그러나 이거는 디자이너의 문제일 뿐이지 빌드의 문제는 아니다. 따라서 디자이너를 쓸 수 없을 뿐 빌드는 제대로 된다. The designer could not be shown for this…

c# round와 반올림

round의 뜻 round는 반올림이라는 뜻이 아니라 ‘특정 자리의 수를 올리거나 내려서 어림수로 만든다’는 의미로 동사다. ‘어림수’라는 명사로는 쓰이지 않는다. 명사인 어림수는 round number/figure라고 한다. 일부 영한사전들에는 반올림이라고 나와 있지만 이는 틀리다. round는 가까운 수로 바꿀 수 있고 먼 수로도 바꿀 수 있다. 컴퓨터 프로그래밍을 하다 보면 round towards zero라는 걸 만나게 되는데 이때에는 ‘내림floor‘이나 ‘버림truncate‘이…

c# DataGridView 잔기술들 5

칼럼 폭 자동 조절 셀 단위로 포맷하기 출력 포맷을 설정할 때에는 주로 칼럼 단위로 하지만 간혹 셀 단위로 해야 할 때도 있다. 아래와 같이 한다. 셀 단위로 색 바꾸기 위의 예제에서 Style.Format을 Style.Backcolor로 바꾸면 된다. 동적으로 바꾸고 싶으면 아래와 같이 DataGridView.CellPainting 이벤트를 쓰면 된다. 이 이벤트가 작동할 때 e.ColumnIndex와 e.RowIndex는 모두 -1 즉 헤더부터 시작하므로…

c# List 잔기술들 2

BindingList로 바꾸기 예를 들어 iEnumerable을 리스트로 만들려면 toList를 이용할 수 있는데 toBindingList는 없다. List로 만든 뒤 BindingList로 타입캐스트를 하려 해도 되질 않는다. 이런 경우를 위해 BindingList는 아래와 같은 컨스트럭터를 제공한다. Remove와 RemoveAt의 성능 비교 Remove는 인스턴스로 찾아서 지우고 RemoveAt은 인덱스 번호로 찾아서 지운다. 후자가 많이 더 빠르다. 지울 대상의 인덱스 번호를 안다면 당연히 후자를 써야 한다….

c# DataTable 잔기술들

열 감추기 DataTable을 건드릴 게 아니라 DataGridView를 제어해야 한다. 파일 입출력 클래스는 procotol buffers(protobuf)를 이용하여 쉽게 바이너리로 바꿀 수 있지만 데이터 테이블은 힘들다. 데이터 테이블도 바꿀 수 있게 프로토버프를 이용한 라이브러리가 나와 있긴 하지만 프로토버프 제작자가 만든 게 아니라서 써 보진 않았다. WriteXml는 데이터 테이블의 이름을 설정해야 작동한다. xml로 저장하고 읽는 건 저장에 많은 용량을…

c# DataTable의 뜨레드 안정성

아래의 코드는 디버그 모드에서 제대로 작동하지 않지만 크로스-뜨레드 예외로 처리되지도 않는다. 릴리스 모드에서는 정상으로 작동한다. 아래와 같이 하면 디버그 모드에서도 잘 된다. DataTable은 뜨레드에서 안전하지 않은데 다른 비주얼 컨트롤들과는 달리 크로스-뜨레드 예외로 처리되지 않고 상황에 따라 다르게 몇몇의 예외로 처리되거나 위의 예제에서처럼 아예 조용하다. 그럼에도 불구하고 이것은 크로스-뜨레드 문제이며 다른 예외 처리에 정신을 팔리거나 유의하지…

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는 리스트…