2010-01-08 2 views
1

내 winforms 응용 프로그램에서 텍스트를 변경 한 후 실행해야 할 몇 가지 코드가 있습니다. 내가 string value = lblText.Text;에 중단 점을 설정C# TextChanged 이벤트가 이전 폭을 사용하는 이유는 무엇입니까?

string value = lblText.Text; 
int labelWidth = lblText.Width; 
int controlWidth = groupPanel1.Width; 

int difference = controlWidth - labelWidth; 

lblText.Left = difference/2; 

내가 올바른 값을 참조 : 라벨에 다음 코드와의 TextChanged 이벤트가 있습니다. 그러나 width 속성은 텍스트 속성의 이전 값 너비를 반환합니다.

예 :

첫 번째로 : text = "hello world!" 폭 : 0

번째 : 텍스트 = "H"폭 : 13

방법 것이 가능하다 : 60

세번째 = "안녕하세요"폭 텍스트?

+0

Windows Forms 질문 인 경우 왜이 태그가 'asp.net'입니까? –

+0

MS 액세스도 추가하십시오. C# 개발자가있을 수 있습니다. –

+0

@Mark : 죄송합니다. 나는 지금 그것을 바 꾸었습니다. – Martijn

답변

4

autosize 속성이 설정된 레이블 인 경우 페인트 이벤트 이후에 재 지정됩니다. 텍스트를 변경하고 새로운 너비를 묻는 것처럼 보이지만 페인트를 묻지 않는 것처럼 보입니다. 그래도 여전히 마지막 너비가 있습니다.

private void label1_TextChanged(object sender, EventArgs e) { 
    this.BeginInvoke(new Action(delegate { 
     string value = lblText.Text; 
     int labelWidth = lblText.Width; 
     int controlWidth = groupPanel1.Width; 
     int difference = controlWidth - labelWidth; 
     lblText.Left = difference/2; 
        this.Text = label1.Width.ToString(); 
    })); 
} 

장소의 TextChanged 핸들러에이 코드 :

+0

기본적으로 당신이 말하는 것은 텍스트 속성이 변경되었지만 레이블이 다시 그려지지 않아서 이전 값의 너비가있는 이유입니다. – Martijn

+0

예. 페인트를 다시 한 후에 값을 확인해야합니다. 텍스트 값을 변경하면 레이블에 대한 다시 페인트 이벤트가 발생하지만 실행될 때까지 동일하게 유지됩니다. – gbianchi

+0

그래서 레이블에 Invalidate()를 호출해야합니까? 그 후에 나는 올바른 폭을 얻을 수 있습니까? – Martijn

0

당신이 뭔가를 (코드가 위임 이동)를 사용해야합니다.

+0

왜 람다를 사용하지 않았습니까? 읽기 쉽습니다. –

+0

죄송합니다. 나는 단지 주니어 프로그래머이며,이 코드를 완전히 이해하지 못합니다. 이 코드는 어디에 두어야합니까? 어떻게 사용합니까? – Martijn

+0

Martijn, 모든 이벤트 핸들러 본문을 보여주기 위해 코드를 변경했습니다. –

관련 문제