星期六, 2月 27, 2021

[SSRS] The value for the DataSetName property is missing

製作報表時,把清單控件拉進報表內,build 時一直有錯誤訊息
The tablix 'Tablix' is invalid. The value for the DataSetName property is missing.
點選錯誤訊息都會直接跳到報表 XML 檔案去,一整個就是無厘頭

[SSRS] The value for the DataSetName property is missing-1

後來發現原來清單控件拉進報表時,除了 Rectangle 外,還有一個 Tablix,必須對 Tablix 設定 DataSetName Property 才行

[SSRS] The value for the DataSetName property is missing-2

星期一, 2月 22, 2021

[C#] PrintPreviewDialog 視窗最大化

PrintPreviewDialog 因為有繼承 Form,直覺是只要設定 WindowState 就可以完成視窗最大化,沒想到 PrintPreviewDialog 跟最大化有關係的,只有
  • MaximizeBox
  • MaximumSize
所以只好把 PrintPreviewDialog 轉型為 Form,就有 WindowsState 屬性可以設定
PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
printPreviewDialog.Document = pd;
printPreviewDialog.UseAntiAlias = true;
(printPreviewDialog as Form).WindowState = FormWindowState.Maximized;
printPreviewDialog.ShowDialog()
正常初始化大小

[C#] PrintPreviewDialog 視窗最大化-1

視窗最大化

  [C#] PrintPreviewDialog 視窗最大化-2

查資料好像也都是透過該方式來達到最大化目的

星期日, 2月 21, 2021

[C#] 使用 PrintPreviewDialog 進行列印

根據該篇文章 - 作法:使用預覽列印在 Windows Forms 中進行列印 的練習,其實 PrintPreviewDialog 的使用還蠻簡易,練習重點在於
  • MeasureString(),之前閱讀時沒有很清楚 charactersOnPage 和 linesPerPage 參數,該範例算是較實務的使用情境
  • 該段 Code,直接看沒有很清楚為何還要重置 stringToPrint 變數,因為實務上有類似應用,想了解看看
if (e.HasMorePages == false)
   stringToPrint = documentContents;  
完整 C# Code
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Windows.Forms;

namespace PrintPreviewSample
{
    public partial class Form1 : Form
    {
        private PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
        private PrintDocument printDocument = new PrintDocument();

        public Form1()
        {
            InitializeComponent();

            printDocument.PrintPage += printDocument_PrintPage;
        }

        // 存儲文字檔內容
        private string documentContents { get; set; }

        // 待列印內容
        private string stringToPrint { get; set; }

        private void ReadDocument()
        {
            string docPath = @"D:\";
            string docName = "testPage.txt";

            using (FileStream stream = new FileStream(Path.Combine(docPath, docName), FileMode.Open))
            using (StreamReader reader = new StreamReader(stream))
            {
                documentContents = reader.ReadToEnd();
                stringToPrint = documentContents;
            }

            printDocument.DocumentName = docName;
        }

        private void btnPrintPreview_Click(object sender, EventArgs e)
        {
            ReadDocument();

            // PrintPreviewDialog 標準使用方式
            printPreviewDialog.Document = printDocument;
            printPreviewDialog.ShowDialog();
        }

        private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            // 測量文字範圍,並回傳範圍內有多少文字和行數
            e.Graphics.MeasureString(
                stringToPrint,
                this.Font,
                e.MarginBounds.Size,
                StringFormat.GenericTypographic,
                out int charactersOnPage, out int linesPerPage);

            // 在範圍內繪製文字
            e.Graphics.DrawString(
                stringToPrint,
                this.Font,
                Brushes.Black,
                e.MarginBounds,
                StringFormat.GenericTypographic);

            // 移除已經列印的文字
            stringToPrint = stringToPrint.Substring(charactersOnPage);

            // 確定是否還有下一頁需要列印
            e.HasMorePages = (stringToPrint.Length > 0);

            // 沒有下一頁可以進行列印的話,就重置 stringToPrint
            // 避免多次使用 Print 功能時,stringToPrint 沒有資料存在
            if (e.HasMorePages == false)
                stringToPrint = documentContents;
        }
    }
}

星期五, 2月 19, 2021

[SSRS] 紙張方向

設計標籤時發現 SSRS 紙張方向和高寬設定值會彼此影響自動變化

原本標籤是橫向,高 1.9 cm、寬 6.4 cm

[SSRS] 紙張方向-1

預計要修正為縱向,高 1.9 cm、寬 6.4 cm
  • 修正方向為縱向時,高寬會自動變化為高 6.4 cm、寬 1.9 cm
  • 直接修正寬高,修正後會自動跳成縱向
[SSRS] 紙張方向-2