2011년 6월 26일 일요일

AutoScaleMode


  프로젝트를 진행하면서 영문 뿐만 아니라 스페인어 OS에서 동작하게 만들어야 했다. 간단히 WinForm 속성중에 Language 속성에 해당 언어만 추가해 주면 잘 되겠지 했는데.. 아니 이게 왠걸..
 영문, 스페인 OS에서 프로그램이 좌우로 수축이 되어 출력된다. 이미 프로젝트는 많이 진행했는데.. 이걸 몰랐다니, 왜 선임은 이런걸 알려주지 않았을까? 몰랐으니까 안알려줬겠지..


AutoScaleMode

화면 해상도나 글꼴이 변경될 때 폼이나 컨트롤의 크기가 조정되는 방식을 결정한다.
MSDN - ContainerControl.AutoScaleMode 속성

WinForm 에서 폼 생성 시 기본적으로 이 프로퍼티의 값은 Font 이다.


Font 적용 시, 운영체제의 글꼴 크기에 따라 컨트롤이나 폼의 크기가 확대 또는 축소된다.

AutoScaleMode 값이 Font로 적용되어 있을 때, 폼에 이미지가 포함되어 있다면 이미지가 확대 또는 축소되게 된다. 또한 컨트롤 간의 간격도 확대 또는 축소되는 등, 컨트롤들이 아주 지 멋대루다. 대부분의 경우에 있어 AutoScaleMode값을 Font로 설정하는 일은 드믈지 않을까 싶다.

 AutoScaleMode 프로퍼티에 설정할 수 있는 값은 4가지 이다.

None : 자동 스케일 변경 없음
Font : 폰트 사이즈에 따른 스케일 변경
Dpi : 화면 해상도 Dpi 변경에 따른 스케일 변경
Inherit : 부모의 상태에 따라 변경


AutoScaleMode에 대해 더 고민하신 분의 링크를 남긴다.
Form과 UserControl의 AutoScaleMode 속성
C#– Windows 환경에 따른 Control Layout 불일치


요약하자면,

Form 의 AutoScaleMode
-  Dpi 값 사용
-  Dpi 값 사용으로 컨트롤들의 사이지가 자동으로 늘어난다.
   하지만 이미지의 경우  Tile 옵션을 주면 자동으로 늘어나지 않으므로 Stretch 옵션을 주자.

UserControl 의 AutoScaleMode
- Inherit 값 사용.

2011년 6월 22일 수요일

DataGridView 선택된 행 삭제


상황1. DataGridView 의 Source 데이터가 바인딩 되지 않고, 직접 데이터를 추가한 경우.


DataGridView의 선택된 행을 삭제하려고 했다. 별 거 없겠지 하고 무심히 아래와 같이 코딩하였다.



int selectedRowCount = dgvList.SelectedRows.Count;

for (int tmpIndex = 0; tmpIndex < selectedRowCount; tmpIndex++)

    dgvList.Rows.Remove(dgvList.SelectedRows[tmpIndex]);






별 거 있더군.. 10개 지웠는데 4개만 지워지고, 가끔 예외도 발생하고.. 모야~
for 반복문으로 DataGridView의 행이 삭제될 때마다 DataGridView의 Rows, SelectedRows 등 정보가 변경된다.

Remove 메소드 인수로 DataGridViewRow를 전달하게 되어있으므로 처음부터 SelectedRows 를 따로 가지고 있다 전달해서 삭제하였다.



DataGridViewSelectedRowCollection selectedRows = dgvList.SelectedRows;



for (int tmpIndex = 0; tmpIndex < selectedRowCount; tmpIndex++)

    dgvList.Rows.Remove(selectedRows[tmpIndex]);






*) Windows Forms DataGridView 컨트롤에서 선택한 셀, 행 및 열 가져오기

*) .NET Framework 3.5
*) Visual Studio Team System 2008 SP1

2011년 6월 7일 화요일

Get IPv4 Address using Dns.GetHostEntry



 예전부터 찜찜하게 생각했던 부분을 오늘 집고 넘어가려고 한다.

로컬 호스트의 IP 주소를 얻기 위해서 Dns.Resolve 메소드를 사용했다.
간단하게 로컬 호스트의 IPv4 주소를 얻을 수 있다.

하지만 VS 출력창에 다음과 같은 경고 메시지가 나온다.




 

Dns.GetHostEntry 메소드를 사용하면 되는데 그렇게 되면 결과셋인 IPHostEntry 객체에 로컬 호스트가 사용하는 IPv4, IPv6 등 모든 정보를 갖게 된다.
나중에야 IPv6 를 사용하긴 할테지만 지금 프로젝트에선 IPv4만 사용하는데.. 이 것 만 어떻게 뽑아 낼까??

외국 아이들도 같은 고민을 했나보다. 뭐... 결국 MSDN만 잘 봤으면 쉽게 해결할 수 있는 거지만..
cf ) GetHostEntry.AddressList[0] returns ::1 on current Windows version even with IPv6 off. Can I change this?

IPHostEntry 에서 AddressList의 IPAddress 인스턴스의 AddressFamily 프로퍼티 값으로 선별 가능하다.