기본 콘텐츠로 건너뛰기

1월, 2022의 게시물 표시

[C#] 작업 프로그래스 바

 장시간(3초 이상)의 작업이 진행되는 경우 사용자가 멍하니 아무런 변화가 없는 모니터를 보게 하는 것 보다 작업 진행 상태를 보여주는 것이 좋습니다. 퍼센트로 작업 진행률을 보여주면 더할 나위 없이 좋겠지만 그렇지 못할 경우에는 진행 애니메이션이라도 보여주는 것이 좋습니다. 이렇게 작업 애니메이션을 보여주기 위해서 C#에서는 BackgroundWorker를 많이 사용합니다. 사용자에게 보여지는 화면은 Main Thread에서 생성하고 실제 작업은 BackgroundWorker에서 담당하게 됩니다. 작업이 진행되는 동안 이벤트를 받아 UI에서 진행률을 업데이트할 수 있습니다. BackgroundWorker는 아래 3개의 이벤트를 제공하고 있습니다. DoWork : 실제 작업을 담당하는 이벤트 ProgressChanged : 작업 진행률을 업데이트하는 이벤트 RunWorkerCompleted : 작업이 끝났을 때 호출되는 이벤트 BackgroundWorker에 대한 예제는 MSDN 에서 찾을 수 있습니다. 이렇게 개발을 진행해도 되지만 개발의 편의성을 위해 BackgroundWorker와 UI를 감싸는 클래스를 만들어 보았습니다. 이 클래스는 작업이 진행되는 동안에 부모 윈도우에 작업 애니메이션을 보여주고 작업이 끝나면 애니메이션을 멈추게 됩니다. 작업은 가상 함수를 override해서 수행할 수 있습니다. 작업 애니메이션은 Telerik의 RadWaitingBar를 이용하여 구현하였습니다.(GIF 애니메이션 파일을 따로 구할 필요가 없어 편리합니다.) class ARSWorker { protected System . Windows . Forms . Control _parent = null ; private BackgroundWorker worker = new BackgroundWorker ( ) { WorkerReportsProgress = true , WorkerSupportsCancellation = true

[Telerik RadGridView] AutoSizeRows 오류

 현재 수행하는 프로젝트에서 Telerik RadGridView를 많이 사용하고 있습니다. 그리고 사용자의 가시성을 높이기 위해 Header Column을 Grouping했는데 이럴때 AutoSizeRows를 true로 설정하면 아래와 같은 오류가 발생합니다. AutoSizeRows를 true로 설정하는 이유는 Cell의 Text가 여러 라인일 경우 거기에 맞게 Row의 높이를 조정하기 위함인데 에러가 발생하니 어쩔 수 없이 프로그래밍으로 높이를 조정해야 합니다. 아래 7번째 줄에서  Text의 줄 수를 구한 뒤 적용한 Font의 높이를 곱하여 Row의 Height를 계산하여 설정하였습니다. private   void RadGridViewLineData_ViewRowFormatting ( object sender, RowFormattingEventArgs e ) { var lts = e . RowElement . RowInfo . DataBoundItem   as PNET ; if ( lts !=   null   &&   ! string . IsNullOrEmpty ( lts . Validation ) ) { var lines = lts . Validation . Split ( ' \n ' ) ; e . RowElement . RowInfo . Height   = e . RowElement . Font . Height * lines . Length ; } } 아래 그림에서 Row Height가 변경된 것을 확인할 수 있습니다.