2012-02-25 1 views
3

다른 사람들이이 같은 문제를 겪지 못해서 누군가가 아이디어를 가지고 있거나 다른 대답을 가르쳐 주었으면합니다.Button.Visible = true; 함수 내에서 활성화되었을 때 버튼이 보이도록 설정하지 못했습니다.

폼의 단추를 눌러 기능을 실행하면 다른 단추가 표시됩니다. 그러나 버튼이 함수의 첫 번째 항목 임에도 불구하고 결코 나타나지 않습니다. 이 함수의 다른 모든 코드는 완벽하게 작동합니다.

private void trackbar_Change(object sender, EventArgs e) 
{ 
    button.Visible = true; 
    progressbar.Visible = true; 

    ... 

    progressbar.Visible = false; 
    button.Visible = false; 
} 

진행 표시 줄이 나타나 잘 작동하고 함수의 다른 모든 코드뿐만 아니라 잘 작동하지만 버튼이 전혀 나타 결코 : 여기

는 코드입니다. 나는 함수의 끝에서 button.Visible = false;를 제거하면

후 버튼을 다른 모든 코드가 실행 된 후에 만 ​​표시 않습니다. 좋아요 :

해당 줄을 주석 처리하면 단추가 표시됩니다. 이제 단추 줄 다음에 메시지 상자를 추가하면 작동합니다.

private void trackbar_Change(object sender, EventArgs e) 
{ 
    button.Visible = true; 
    MessageBox.Show("Button should be visible now"); 
    progressbar.Visible = true; 

    ... 

    progressbar.Visible = false; 
    button.Visible = false; 
} 

단추 줄 다음에 메시지 상자를 추가하면 적절한시기에 단추가 표시됩니다.

누구나이 버튼이 이런 식으로 행동하는 이유는 무엇입니까?

+0

짧은 대답, 아니요. 이것은 이상한 사실입니다 ... 대답을 듣기 위해 기다릴 수 없습니다. 'trackbar_Change()'도중 – Induster

+3

일 때 UI가 메시지 상자를 올리는 것과 같은 것으로 막히지 않으면 UI가 업데이트되지 않습니다. 버튼을 다른 곳에 숨겨야합니다. (아마, 진행률 표시 줄의 진행률에?) –

+1

당신은 그것을 보여주고, 그것을 다시 숨기고 있습니다. 정확히 무엇을하고 싶습니까? – rfmodulator

답변

6

GUI 스레드가 사용중인 것처럼 들립니다. 예를 들어, Application.DoEvents()를 호출하여 화면 업데이트를 강제로 시도해보십시오

button.Visible = true; 
progressbar.Visible = true; 
Application.DoEvents(); 

DoEvents() 처리 할 메시지 큐에있는 모든 메시지를 강제 할 것이다.

더 나은 해결책은 기본 UI 스레드의 장기 실행 스레드를 이동하는 것입니다. 작업에 BackgroundWorker을 사용하십시오.

전체적으로 양식의 응답 성이 향상됩니다. 예를 들어 양식과 상호 작용할 수 있고 '흰색'으로 변하지 않습니다. BackgroundWorker에 구현하는 것은 간단 메인 UI 스레드에서 장기 실행 프로세스의 필수,

+1

DoEvents()를 제안하지 않는 것이 가장 좋습니다. –

+1

@JeffMercado, 나는 DoEvents()가 적절한 방법이 아니라는 것에 전적으로 동의한다. 그러나 OP가 DoEvents를 알아 차리고 올바른 접근법과 대조하여 더 많은 문맥을 갖지 않는 것이 좋습니다. –

+0

나는 그것을 결코 사용해서는 안되는 것이라고 말하는 것만으로도 완벽하다고 생각합니다. 왜 피해야하는지 이해하는 것이 중요합니다. 그러나 사용법을 보여주는 코드 예제를 제공하면 처음 보는 코드를 더 잘 모르는 사람들을위한 함정을 설정하게됩니다. 그래서 나는 단지 그것에주의해야한다고 말하고 있습니다. –

1

문제는 UI 스레드에서 장기 실행 프로세스를 실행하고 스레드를 사용 가능하게 할 때까지 버튼을 표시하도록 설정한다는 것입니다. 그러나 스레드가 해제 될 때까지는 false로 설정할 수 있습니다.

이 작업을 수행하는 가장 좋은 방법은 UI 스레드가 차단되지 않도록 백그라운드 작업자에게 장기 실행 프로세스를 실행하는 것입니다. 진행 막대가 작동하는 이유는 다른 스레드에서 실행되기 때문입니다.

또 다른 방법이 있지만 정확하지는 않을 수 있습니다.이 방법은 표시를 true로 설정 한 후 양식에서 새로 고침을 실행하는 것입니다.

BackgroundWorker에 도움이 필요하면 알려주세요.하지만 꽤 간단합니다.

0

당신이 윈도우 폼을 실행, 그것은 이벤트를 처리하기 위해 대기합니다 새 양식을 만듭니다. 폼이 이벤트를 처리 할 때마다 해당 이벤트와 관련된 모든 코드를 처리합니다. 다른 모든 이벤트는 대기열에서 대기합니다.코드가 이벤트를 처리하는 동안 응용 프로그램이 응답하지 않습니다. 예를 들어, 다른 윈도우를 위에서 드래그하면 윈도우가 다시 그려지지 않습니다.

코드에서 DoEvents를 호출하면 응용 프로그램에서 다른 이벤트를 처리 할 수 ​​있습니다. 사용 Application.DoEvents();

관련 문제