ProgressBar는 작업 진행률을 사용자에게 보여주거나 할 때 쓰이는 도구이다.
흔히 로딩바라고 부르는것과 비슷하다.
만들어본 동작은 간단하다. 아래 그림 1,2,3과 같이
버튼을 누르면 ProgressBar가 0에서 100까지 진행한 뒤 진행완료 메시지를 출력하는것.
<그림 1>
<그림 2>
<그림 3>
ProgressBar 도구가 이미 만들어져 있기에 사용법은 간단하다.
도구 상자의 ProgressBar를 찾아 넣기만 하면 끝이다.
처음 생성시키면 속성의 Max값과 Min값은 각각 100과 0으로 설정되어 있다.
만약 위처럼 겉모양만 해보는게 아닌 실제 작업진행률을 표시할 땐
이 Max값을 전체 작업량으로 설정하면 될 것이다.
그 외에 눈여겨 볼 속성으론 Step과 Value, Style정도가 있다.
Step 속성은 PerformStep() 메서드를 호출할 때 표시줄의 현재 위치를 증분시킬 크기를 설정할 수 있는 속성이다.
예를들어 Step값이 1이면 Max가 100 Min이 0일 때 작업이 100번 일어나야 표시줄이 다 채워지는 것.
Step속성을 지정하고 PerformStep()메서드로 진행하는 방법도 있지만
Increment(Step값)를 이용해서 진행하는 방법도 있다.
1 2 3 4 | //Increment이용 this.progressBar1.Increment(1); //Step, PerformStep 이용 this.progressBar1.PerformStep(); | cs |
<코드 1>
Step의 크기가 1일 때 <코드 1>의 두 코드는 같게 동작한다.
Value 에는 표시줄의 현재 진행 값이 들어간다.
Style 속성으론 표시줄의 스타일을 지정할 수 있다.
Blocks, Continuous, Marquee 로 3가지 스타일이 있는데 OS에 따라 다른경우도 있다.
Blocks와 Continuous는 똑같이 연속적으로 증가하는 형태지만
Blocks의 경우 XP 이전의 OS에서는 블록을 쌓아가는 형태의 표시줄로 보여진다.
<그림 4 : 구버전 OS의 Blocks 스타일>
<그림 5 : Marquee 스타일>
아래는 위 그림1,2,3을 구현한 코드다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private void button1_Click(object sender, EventArgs e) { //backgroundWorker1.RunWorkerAsync(); for (int i = 0; i < 100; i++) { //this.progressBar1.Increment(1); this.progressBar1.PerformStep(); this.label1.Text = progressBar1.Value.ToString() + "%"; Update(); //this.label1.Refresh(); Thread.Sleep(100); } if (progressBar1.Value == 100) { MessageBox.Show("진행완료"); } } | cs |
<코드 2>
동작을 구현하던 중 한가지 문제를 겪었었는데
바로 ProgressBar가 진행하는 동안 진행률을 표시해주기 위해 label.Text에 값을 넣어주는 코드가
정상적으로 동작하지 않는 문제였다.
코드 자체는 동작을 했지만 프로그래스바가 진행 완료될 때 까지 실시간으로 화면에 출력되지는 않는 문제였는데
혹시 스레드가 자식객체인 표시줄을 진행시키는 일에 할당되어 label값이 변경되어도 부모객체인 Form을 update시키질
못하는게 아닐까 생각되어 찾아보니 내부에서 따로 Update문을 추가하는 것으로 해결할 수 있었다.
<코드 2>의 10번 줄을 보면 Update문을 추가한 것을 볼 수있다.
Update이외에도 11번 줄로처럼 Label을 Refresh시켜주는 것으로도 대체 가능했다.
Update나 Refresh말고도 BackgroundWorker를 이용하는 방법도 있다는것 같은데
몇번 시도해봤지만 어째선지 실패하여 일단 보류시켜뒀다.
'IT > 윈도우 폼' 카테고리의 다른 글
[VS 2013] 스크롤바를 이용해 RGB값 변경하기 (0) | 2018.05.20 |
---|---|
[VS 2013] 라디오버튼과 체크박스 폼 (0) | 2018.05.18 |
[VS 2013] Timer를 이용한 실시간 시간 출력 (0) | 2018.05.17 |
[VS 2013] DateTimePicker로 시간 선택 및 표시 (0) | 2018.05.17 |
[VS 2013] 모달과 모달리스 (0) | 2018.01.30 |