c# 콤보박스에 아이템을 추가하고 추가된 아이템을 보이게 하기
ComboBox에 아이템을 추가하기만 하면 SelectedIndex는 바뀌지 않기 때문에 추가된 아이템은 보이지 않는다. 추가된 아이템을 보이게 하려면 SelectedIndex를 마지막 인덱스로 바꿔야 한다. 그렇다고 ComboBox.Items.Count – 1이라고 하는 건 좀 바보스럽다. 아래와 같이 하면 간단하다.
ComboBox에 아이템을 추가하기만 하면 SelectedIndex는 바뀌지 않기 때문에 추가된 아이템은 보이지 않는다. 추가된 아이템을 보이게 하려면 SelectedIndex를 마지막 인덱스로 바꿔야 한다. 그렇다고 ComboBox.Items.Count – 1이라고 하는 건 좀 바보스럽다. 아래와 같이 하면 간단하다.
ComboBox.ObjectCollection.Add()는 널을 아규먼트로 받을 수 없다. 이 메서드에 널을 넣으면 애플리케이션이 멈춘다. 아래의 코드에서 method1에 널 아닌 값이 가더라도 컴파일러는 cs8604 경고를 보낸다. 의도하지 않은 상황에 널이 전달되어 애플리케이션이 멈추는 것을 막으려는 거다. 변수 오른쪽에 ?를 붙이면 널도 값으로 가질 수 있는 변수가 된다. 이걸 nullable variable이라 한다. 위 예제에서는 cs8604 상황을 일부러 만들기 위해서…
밸류 타입 데이터를 메모리나 파일에 저장할 경우에는 그냥 순서대로 write하거나 시작 메모리 주소와 전체 크기를 지정하여 한꺼번에 write하면 되지만 레퍼런쓰 타입은 이렇게 하면 주소만 저장된다. 이런 문제를 피하기 이해 저장할 데이터를 바이트의 형태로 나열하는 걸 serialize한다고 한다. 델파이와 달리 .네트에는 씨리얼라이즈하기에 편한 클래쓰들이 준비되어 있다. 최근까지는 BinaryFormatter가 많이 이용되었지만 마이크로쏘프트는 이걸 이제는 이용하지 말고 XmlSerializer나…
흔히들 goto는 가급적 쓰지 말라고 한다. 나도 좋아하지는 않는다. 레퍼런쓰는 아래와 같은 경우 완전히 빠져나오고 메떠드를 분리하는 걸 권한다. When you work with nested loops, consider refactoring separate loops into separate methods. That may lead to a simpler, more readable code without the goto statement.– Jump statements – break, continue, return, and goto 그러나 늘…
정적 메떠드와 프라퍼티는 static 선언이 되지 않은 필드와 이벤트에 접근할 수 없다. 정적 멤버는 프로그램이 실행될 때 로드되는데 이때 정적이지 않은 멤버는 로드되지 않은 상태이기 때문이다. If your class contains static fields, provide a static constructor that initializes them when the class is loaded.– Static Classes and Static Class Members (C# Programming Guide) 참고로 여기에서…
c# 프로그래밍만 할 때에는 이럴 일이 없는데 c++이나 델파이로 만든 dll을 이용한다면 클래쓰나 구조체를 포인터로 넘겨줘야 하는 경우들이 많다. 포인터는 메모리의 주소를 나타내는 결국 정수다. 특정 객체가 위치해 있는 메모리상의 위치와 그 크기만 안다면 어디에서부터 어디까지 그대로 넘겨서 데이터를 전송할 수 있다. 정수 두 개만 제어하면 되니까 아마도 대부분의 경우 정수 두 개보다는 훨씬 크기가…
델파이의 경우 단순하다. 무엇을 무엇으로 나누던 그 결과를 그대로 반환한다. 예를 들어 1/2를 정수 변수에 반환하려 하면 오류로 처리된다. 그러나 c#에서는 복잡하다. 정수를 정수로 나누면 정수 즉 몫만 반환한다. For the operands of integer types, the result of the / operator is of an integer type and equals the quotient of the two operands rounded…
리스트박스의 쎌렉션 모드는 one이 기본값이다. 이대로 출력을 하면 늘 아이템 하나가 파랗게 선택되어 있는데 아이템을 선택할 일 없이 그저 출력만 하는 게 목적이라면 이게 걸리적거린다. 이걸 없애려고 none으로 바꾸면 DataSource가 작동을 하지 않아 내용이 바뀌어도 출력이 되질 않는다. 오래된 오류이지만 수정되지 않고 있다. 리스트박스 대신 ItemsControl을 쓰면 되지만 아래와 같이 하는 게 더 간단하다.
리스트 박스 아이템의 색을 설정하려면 DrawMode를 바꿔야 한다. 이걸 바꾸면 직접 제어하겠다는 거다. 크기도 바꿀 수 있다. 이럴 땐 variable로 선택한다. 아래 예제는 특정 아이템을 골라서 색을 바꾸는 거다. 다 그린 다음에 리스트 박스에서 루프를 돌리는 거보다 리스트에 담을 때 표시를 하는 게 좋다. 눈에 보이지 않는 탭 문자를 아이템의 끝에 붙여서 색을 다르게 할 아이템을 구별했다.