2016-10-10 1 views
-2

버튼을 클릭하면 i = 0에서 루프가 시작되고 i의 라벨 값을보고 싶습니다. 그러나 나는 마지막 값만을 본다.버튼의 레이블 텍스트 변경하기 - 클릭 루프에 대한 이해

public partial class Form1 : Form 
    { 
     int i; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnclick_Click(object sender, EventArgs e) 
     { 
      for ( i = 0; i < 3; i++) 
      {     
       lblForLoopExample.Text = i.ToString(); 
       System.Threading.Thread.Sleep(1000); 
      } 
     } 
    } 

내 코드를 실행할 때 레이블에만 표시됩니다. 2.

아래와 같이보고 싶습니다.

For 루프가 시작될 때, i = 0이면 Label.Text에 0이 표시되어야합니다. 그러면 i = 1 일 때 label.Text에서 1을보아야합니다. 그리고 i = 2 일 때 Label.Text에서 2를보아야합니다.

Thread.Sleep (1000)을 추가했지만 결과가 변경되지 않았습니다.

어디에서 실수합니까?

도와주세요. 도와 주시면 감사하겠습니다.

감사합니다.

+0

코드가 너무 빠르게 실행됩니다. 수면을 추가하거나 관찰 할 수 있는지 기다려보십시오. Thread.Sleep (1000)을 1 초 동안 잠자기합니다. –

+0

루프가 매우 빠르므로 레이블이 어떻게 업데이트되는지 알 수 없으므로 마지막 값인 2 – mbadeveloper

+0

네가 올바르게 표시됩니다. thread.sleep (1000)을 추가했습니다. 하지만 마지막 값을 다시 보았습니다 –

답변

0

문제는 UI 스레드가 양식을 업데이트 할 때 UI 스레드에서 작업하고 있다는 것입니다.

루프를 처리하는 동안 UI 스레드가 실제로이 코드를 실행하고 있습니다. 따라서 UI 스레드는 루프 내에서 설정중인 중간 값으로 폼을 업데이트 할 수 없습니다. 코드가 완료되면 UI 스레드는 양식을 자유롭게 업데이트 할 수 있습니다. 그래서 마지막 값만 볼 수 있습니다.

코드를 3 천 개가 아닌 1 천만 번 반복하면이 모양이 더 잘 나타납니다. 양식이 응답하지 않아 잠긴 것처럼 보입니다. 이는 Windows가 사용자의 UI 스레드가 집중적 인 프로세스에서 잠겨 있고 UI를 업데이트 할 수 없다는 것을 알고 있기 때문입니다.

해결 방법은 백그라운드 스레드를 사용하여 프로세스를 실행하고 업데이트를 UI 스레드와 동기화하는 것입니다. 다른 사람들이 제안한 것처럼 변경 사항을 보려면 루프 속도를 늦춰야합니다.

UI 스레드가 작동하는 방식과 배경 스레드를 동기화하는 방법에 대해 자세히 알아 보려면 read this article (WPF에 관한 내용이지만 일반적인 경우를 다룹니다).

1

모든 값을 얻으려면 lbl을 추가해야합니다. 지금 당장 루프를 끝내고 라벨의 마지막 값을 알려줍니다.

public partial class Form1 : Form 
{ 
    int i; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnclick_Click(object sender, EventArgs e) 
    { 
     for ( i = 0; i < 3; i++) 
     { 

      lblForLoopExample.Text + = i.ToString(); 


     } 
    } 
} 
+0

루프에'i.ToString()'을 추가하십시오 – mybirthname

+0

sory 그것은 오타입니다. 이미있다; –

+0

Nirjhar, 네, 맞아요. thread.sleep (100)을 추가했습니다. 하지만 마지막 값을 다시 보았습니다. –

0

각 루프를 다시 쓰면 루프가 다시 작성됩니다. 대신 말해

lblForLoopExample.Text = i.ToString(); 

반복 할 때마다 문자열에 추가해야합니다. 나는이 같은 일을 값을 보유 할 변수를 만든 것 :

string myString = string.Empty; 

for(i=0;i < 3; i++) 
{ 
    myString += i.ToString() + ", "; 
} 

lblForLoopExample.Text = myString.substring(0, (myString.length - 1)); 

문자열 당신이 쉼표를 후행 것을하지 않아도 바로 그래서이다. 그것은 일종의 더러운 코드이지만 작동 할 것입니다. 당신이 ToString() 방법의 정확한 형식을 누락으로 모든

0

먼저, 코드가 코드에 따라, ;

lblForLoopExample.Text = i.ToString(); 
            ^^^ 

와 함께 i.ToString에 컴파일되지 않습니다, 당신이 시도해야합니다

for ( i = 0; i < 3; i++) 
{ 
    lblForLoopExample.Text += i.ToString() + ", "; 
} 
관련 문제