Page_Load 이벤트 처리기에서 보고서를 바인딩할 때의 유지 제한 사항
ASP.NET 웹 응용 프로그램에서는 일반적으로 페이지의 모든 시작 코드를 Page_Load 이벤트 처리기에 배치합니다. 이 이벤트 처리기는 Page.Load 이벤트에서 호출됩니다.
특히, 컨트롤 데이터 바인딩 코드는 일반적으로 Page_Load 이벤트 처리기 내에 저장됩니다. 그러나 이 이벤트 처리기에 바인딩 코드를 배치하면 ViewState에 문제가 발생합니다. 문제의 증상과 일반적인 해결 방법은 다음과 같습니다.
- ViewState는 페이지를 다시 로드할 때마다 컨트롤에 바인딩된 데이터와 컨트롤에 대해 수행한 마우스 클릭 이벤트를 유지하는 데 사용됩니다.
- ViewState는 문자열입니다. 따라서 데이터와 클릭 이벤트를 모두 serialize해야 합니다.
- 페이지를 다시 로드하는 동안 데이터와 클릭 이벤트가 모두 ViewState에서 복원됩니다.
- Page.Load 이벤트는 ViewState를 복원한 후에 발생합니다. Page_Load 이벤트 처리기에 컨트롤 바인딩 코드가 포함되어 있으면 페이지를 다시 로드할 때 이 바인딩 코드가 ViewState를 덮어쓰기 때문에 원래 데이터와 클릭 이벤트가 모두 소실됩니다.
- 일반적으로 이 문제는 페이지를 다시 로드할 때 컨트롤에서 마우스 클릭 동작(예: DropDownList 선택)을 무시하는 증상으로 나타납니다.
- 데이터와 마우스 클릭 이벤트를 덮어쓰지 않도록 하려면 Page_Load 이벤트 처리기의 모든 바인딩 코드를 Not IsPostBack 조건 블록 내에 배치합니다. 이렇게 하면 다시 게시하는 과정에서 바인딩 코드가 호출되지 않습니다.
이 해결 방법을 사용하려면 데이터와 마우스 클릭 이벤트를 모두 ViewState로 serialize할 수 있어야 합니다. 그러나 CrystalReportViewer 컨트롤은 serialize할 수 없는 개체(특히 ReportDocument 클래스, ReportClientDocument 클래스 또는 InfoObject 클래스)에 바인딩됩니다.
참고 |
---|
여기에는 한 가지 예외가 있습니다. CrystalReportViewer 컨트롤이 해당 파일 디렉터리 경로로 보고서에 바인딩되어 있으면 경로 문자열을 ViewState에 유지할 수 있습니다. 이 시나리오에 한해서 CrystalReportViewer 컨트롤을 Not IsPostBack 조건 블록에 배치할 수 있습니다. 그러나 이 보고서 바인딩 시나리오는 앞서 소개한 보고서 클래스에 대한 바인딩 시나리오보다 강력하지 않으며 일반적으로 사용되지 않습니다. |
CrystalReportViewer 컨트롤의 마우스 클릭 이벤트만 ViewState에 serialize할 수 있으므로 serialize할 수 없는 보고서 클래스에 바인딩하면 페이지를 다시 로드하는 동안 해결할 수 없는 문제가 발생합니다.
- 보고서 바인딩 코드를 Not IsPostBack 조건 블록 내에 배치한 경우 ViewState의 마우스 클릭 이벤트가 유지됩니다. 그러나 보고서 바인딩은 발생하지 않습니다. 따라서 예외가 throw합니다.
- 보고서 바인딩 코드가 조건 블록 바깥에 배치되어 있으면 보고서는올바르게 바인딩되지만, 이 과정에서 ViewState를 덮어쓰게 됩니다. 따라서 마우스 클릭 이벤트가 소실됩니다.
참고 이 현상은 일반적으로 CrystalReportViewer 컨트롤에서 여러 페이지로 구성된 보고서를 클릭할 때 발생합니다. 보고서가 계속하여 첫 번째 페이지로 되돌아가는 문제가 발생할 수 있습니다.
권장 해결 방법: CrystalReportViewer 컨트롤의 바인딩 코드를 Init 이벤트로 이동
CrystalReportViewer 컨트롤 문제에 대한 해결 방법은 ViewState를 복원하기 전에 발생하는 Init 이벤트로 해당 보고서 바인딩 코드를 옮기는 것입니다.
이 해결 방법을 사용하면 한 가지 복잡한 상황이 발생합니다. Init 이벤트는 Load 이벤트보다 드물게 코딩되므로 액세스하기가 더 어렵습니다. Visual Studio .NET 2002 또는 2003 웹 프로젝트나 Windows 프로젝트에서 Init 이벤트 처리 코드는 일반적으로 생성된 코드에 대해 예약되고 숨겨진 영역인 Web Form 디자이너에서 생성한 코드 영역 내에 배치됩니다.
이 문제를 해결하려면 다음과 같은 방법을 사용하는 것이 좋습니다.
- 모든 CrystalReportViewer 바인딩 및 구성 코드를 ConfigureCrystalReports()라는 private 도우미 메서드로 추출합니다.
- Web form 디자이너에서 생성한 코드 영역 내의 Page_Init() 이벤트 처리기 또는 OnInit() 이벤트 발생 메서드에 ConfigureCrystalReports() 도우미 메서드를 호출하는 한 줄의 코드를 배치합니다.
ConfigureCrystalReports() 도우미 메서드를 만들고 채우는 방법에 대한 자세한 내용은 "프로젝트 설정"을 참조하십시오.
자습서
다음 자습서에서 보고서의 상태 유지에 대한 좀 더 자세한 내용을 설명합니다.
ReportDocument 개체 모델을 사용하여 코딩하는 경우에는 다음 자습서를 참조하십시오.