WinForms PrintDocument를 사용하여 .NET 6 Financial Report 앱 빌드
페이지 정보
작성자 GrapeCity 작성일 2022-06-15 17:14 조회 2,226회 댓글 0건본문
관련링크
최근에 Microsoft는 Visual Studio 2022 Preview에서 작업 중인 개발자를 위해 .NET 6 Preview 환경을 출시했습니다(.NET 6는 기본적으로 Visual Studio 2019에서 작동하지 않습니다). .NET 6 릴리스와 함께 최신 WinForms 버전에서 작업 경험을 훨씬 쉽게 만들어줄 자체 .NET 6 컨트롤을 릴리스했습니다. 이번에는 WinForms PrintDocument 컨트롤을 사용하여 연간 재무 보고서를 만드는 방법을 배워 봅니다.
보고 컨트롤(예: FlexReport) 중 하나 대신 PrintDocument 컨트롤을 사용하는 주요 이점 중 하나는 PrintDocument를 사용하면 어떤 항목을 어디에, 어떻게 배치할지를 비롯하여 문서의 전체 렌더링을 완벽하게 제어할 수 있다는 점입니다. PrintDocument 컨트롤 내 모든 행을 완벽하게 사용자 정의할 수 있습니다.
다른 보고 컨트롤과 비교하면 PrintDocument를 사용했을 때 개발자 오버헤드가 약간 늘어나지만 PrintDocument가 제공하는 사용자 정의 가능성은 매우 뛰어납니다. 원하는 모든 보고서, 이미지, pdf, 텍스트 등을 만들 수 있지만 이 실용적인 예에서는 연간 재무 보고서를 만들어 보겠습니다. 이 샘플에 사용한 더 자세한 문서를 찾으려면 링크를 방문해 보시기 바랍니다.
시작하기 위해 Visual Studio 2022 Preview를 열고, 새 .NET 6 WinForms 응용 프로그램을 만들고, Visual Studio Tools 메뉴에서 NuGet Package Manager로 이동하여 C1.Win.Printing(6.0.20213.530) 이상을 추가합니다.
다음으로 Form1.cs 디자이너 페이지로 이동하고 Visual Studio 도구 상자를 열어 C1PrintDocument 컨트롤 및 C1PrintPreviewControl을 폼에 추가합니다. C1PrintDocument 및 C1PrintPreviewControl이 둘 다 폼에 있으면 C1PrintPreviewControl의 오른쪽 위 모서리에 있는 스마트 태그를 클릭하여 부모 컨테이너에 고정하려고 합니다.
빈 PrintDocument 객체를 만드는 것으로 시작합니다.
C1PrintDocument doc = new C1PrintDocument();
다음으로, 데이터가 필요합니다. 기본 데이터베이스가 있는 경우 PrintDocument 컨트롤에 연결하려고 합니다. 렌더링된 객체가 표시하는 데이터의 데이터 소스를 지정할 수 있는 C1DataBinding 유형인 RenderObject의 DataBinding 속성을 통해 연결할 수 있습니다. 그런 다음 이 문서는 C1DataSchema로 표현되는 데이터베이스 스키마를 포함할 수 있고 SQL 쿼리 등 데이터베이스 연결 정보를 포함합니다. 문서 내 C1DataBinding 개체는 해당 스키마의 속성을 참조할 수 있습니다. 또는 C1DataBinding 개체는 DataTable 등과 같은 기존 데이터 소스를 참조할 수 있는데, 이러한 데이터 소스는 폼에서 생성되었거나 PrintDocument를 만든 프로그램의 다른 곳에서 생성되었습니다. 간단히 설명하기 위해 이 예에서는 응용 프로그램 내에 PrintDocument에 데이터를 공급하는 RenderTable을 만듭니다.
여기서는 RenderTables 개체를 두 개 만드는데, 보고서 및 회사의 "제목"용으로 하나 만들고 두 번째 RenderTable은 실제 데이터를 저장합니다.
// Create two RenderTable objects: RenderTable rt = new RenderTable(); RenderTable rt1 = new RenderTable(); // Here we are utilizing our second RenderTable to create extra headers above our grid, and we have lines turned off by default so nothing shows. rt1.Cells[0, 0].Text = "ANNUAL FINANCIAL REPORT"; rt1.Cells[1, 0].Text = "Enter Company Name Here"; rt1.Rows[0].Style.FontSize = 24; rt1.Rows[1].Style.FontSize = 20;
데이터를 포함하는 RenderTable의 경우 열 헤더를 설정하는 데 첫 번째 행을 사용했습니다.
// add initial header data rt.Cells[0, 0].Text = "METRIC"; rt.Cells[0, 1].Text = "THIS YEAR (2022)"; rt.Cells[0, 2].Text = "LAST YEAR (2021)"; rt.Cells[0, 3].Text = "% CHANGE";
그런 다음 각 행에 대한 데이터를 아래와 같이 수동으로 설정합니다.
// Row 1 rt.Cells[1, 0].Text = "Revenue"; rt.Cells[1, 1].Text = "$180,583.88"; rt.Cells[1, 2].Text = "$180,026.64"; rt.Cells[1, 3].Text = "0%";
스타일
데이터를 모두 제공한 다음에는 RenderTables의 스타일 속성을 설정할 차례입니다. 가장 먼저 할 일은 두 번째 RenderTable에 대한 눈금선을 켜고 데이터 행을 명확하게 구분하기 위해 안쪽 여백을 추가하는 것입니다.
rt.Style.GridLines.All = LineDef.Default; rt.CellStyle.Padding.All = "2mm";
또한 부모 페이지의 너비를 따르는 기본값 대신 열 및 행 내의 데이터에 따라 크기를 자동으로 조정하도록 열 및 행을 설정할 수 있습니다.
// 1) By default, table width is set to parent (page) width, // for auto-sizing we must change it to auto (i.e. based on content): rt.Width = Unit.Auto; // 2) Set ColumnSizingMode to Auto (default means Fixed for columns): rt.ColumnSizingMode = TableSizingModeEnum.Auto; // that's it, now the table's columns will be auto-sized.
전체 행 스타일에 쉽게 액세스하기 위해 또는 손쉬운 조작을 위해 행 범위를 그룹화하려는 경우 RowGroups 컬렉션에 쉽게 액세스하기 위해 RenderTable 클래스에 포함된 여러 컬렉션을 사용할 수도 있습니다. 아래 이미지에서는 RowGroups.Header 속성을 사용하여 첫 번째 행을 헤더 및 페이지 헤더로 레이블을 지정합니다.
// Add the first row as a header and make the text color white and bolded rt.RowGroups[0, 1].Header = C1.C1Preview.TableHeaderEnum.Page; rt.Rows[0].Style.TextColor = Color.White; rt.Rows[0].Style.FontBold = true; rt.RowGroups[0, 1].PageHeader = true; // Change the header background color rt.RowGroups[0, 1].Style.BackColor = Color.Green;
그런 다음, Rows.Count 속성과 함께 다음 로직을 사용하여 행마다 다른 배경색을 추가할 수 있습니다.
for(int i = 1; i < rt.Rows.Count; i++){ if (i % 2 == 0){ rt.Rows[i].Style.BackColor = Color.White; } else { rt.Rows[i].Style.BackColor = Color.LightGray; } }
마지막으로, PrintDocument 객체에 RenderTables를 추가한 다음 몇 행의 코드와 함께 PrintPreview 컨트롤에 PrintDocument 객체를 로드할 수 있습니다.
// Add the tables to the document doc.Body.Children.Add(rt1); doc.Body.Children.Add(rt); // Show the document this.c1PrintPreviewControl1.Document = doc;
이 응용 프로그램을 실행하면 PrintPreview 컨트롤에서 직접 "저장" 아이콘을 통해 파일을 인쇄하거나 여러 가지 다양한 파일 형식(예: PDF, .xlsx, .xls, .rtf 등)으로 내보낼 수 있습니다. 전체 목록은 아래 이미지에 나와 있습니다.
지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.