Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

C# 単票印刷 解決済み

タグの編集...

投稿者 ケンケン   (社会人)   投稿日時 2022/6/29 13:23:47
仮に顧客dbとします(dbの設定でなくても大丈夫です)。

1レコード目を読み込み、プルーフリスト顧客の内容(〒、tel , 住所等)を出力する。

ここで改頁して

2レコード目を読み込み、プルーフリストに出力るす。

上記の印刷は可能ですか。

 1レコードで一帳票のイメージです。

   何方か分かる方、ご教授お願い致します。

    多分、レポート(rdlc)

投稿者 るきお   (社会人)   投稿日時 2022/6/29 23:11:55
たとえば、Windowsフォームアプリの PrintDocumentコントロールを使うとこのような感じになります。

このサンプルを実行するにはフォームに PrintDocumentコントロールとPrintPreviewDialogコントロールとButtonを貼り付けてください。Buttonのクリックイベントハンドラーはサンプル内のbutton1_Click()にしてください。

私はこれをVisual Studio 2022 + .NET 6.0 で作成しましたが、他のバージョンでも通用します。

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            printPreviewDialog1.Document = printDocument1;
        }

        private System.Data.DataTable customersTable;
        private int pageIndex = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            customersTable = LoadData();
            printPreviewDialog1.ShowDialog();
        }


        private System.Data.DataTable LoadData()
        {
            System.Data.DataTable table = new System.Data.DataTable();
            table.Columns.Add("name", typeof(string));
            table.Columns.Add("postal", typeof(string));
            table.Columns.Add("tel", typeof(string));
            table.Columns.Add("address", typeof(string));

            table.Rows.Add("徳川家康""111-1111""090-1111-1111""東京都千代田区江戸城本丸");
            table.Rows.Add("豊臣秀吉""222-2222""090-2222-2222""京都府聚楽亭");
            table.Rows.Add("織田信長""333-3333""090-3333-3333""滋賀県安土城1丁目");

            return table;

        }
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            var f = new Font("MS 明朝", 24, FontStyle.Bold);
            int lineSpace = (int)(f.GetHeight() * 1.5);


            if (pageIndex < customersTable.Rows.Count - 1)
            {
                e.HasMorePages = true;
            }
            System.Data.DataRow row = customersTable.Rows[pageIndex];

            //〒、tel , 住所等

            e.Graphics!.DrawString("名前", f, Brushes.Black, 10, 10);
            e.Graphics!.DrawString(row["name"].ToString(), f, Brushes.Black, 200, 10);

            e.Graphics!.DrawString("〒", f, Brushes.Black, 10, 10 + lineSpace);
            e.Graphics!.DrawString(row["postal"].ToString(), f, Brushes.Black, 200, 10 + lineSpace);

            e.Graphics!.DrawString("tel", f, Brushes.Black, 10, 10 + lineSpace * 2);
            e.Graphics!.DrawString(row["tel"].ToString(), f, Brushes.Black, 200, 10 + lineSpace * 2);

            e.Graphics!.DrawString("住所", f, Brushes.Black, 10, 10 + lineSpace * 3);
            e.Graphics!.DrawString(row["address"].ToString(), f, Brushes.Black, 200, 10 + lineSpace * 3);

            pageIndex += 1;
        }

        
    }
}


投稿者 ケンケン   (社会人)   投稿日時 2022/6/30 11:57:12
るきおさん

お忙しいところ回答をありがとうございました。

私も、Visual Studio 2022 + .NET 6.0 で作成いたしましたが、
出力されません。

何かヒントがあれば宜しくお願い致します。



 


投稿者 るきお   (社会人)   投稿日時 2022/6/30 12:37:03
その何も出力されないプログラムを載せていただければ何かわかるかもしれません。
今の情報ではわかりません。

投稿者 るきお   (社会人)   投稿日時 2022/6/30 20:57:42
1つ思いつきました。
printDocument1のPrintPageイベントのハンドラーに printDocument1_PrintPage を指定していないということはありませんか?

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/6/30 21:41:51
るきおさんのサンプルに補足で:

PrintDocument の BeginPrint イベントにて
『pageIndex = 0;』と書いておいた方が良いでしょう。
再印刷(あるいはプレビュー後の印刷)時に対応するために。


また、印刷処理中の PrintPage イベントの末尾にて、
『f.Dispose();』と書いておくことをお奨めします。

投稿者 ケンケン   (社会人)   投稿日時 2022/7/2 07:00:55


           customersTable = LoadData();

            //PrintDocumentオブジェクトの作成
            System.Drawing.Printing.PrintDocument pd =
                new System.Drawing.Printing.PrintDocument();
            //PrintPageイベントハンドラの追加
            pd.PrintPage +=
                new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);

            //PrintPreviewDialogオブジェクトの作成
            PrintPreviewDialog ppd = new PrintPreviewDialog();
            //プレビューするPrintDocumentを設定
            ppd.Document = pd;
            //印刷プレビューダイアログを表示する
            ppd.ShowDialog();

 
     上記の様に修正して、動きの確認が取れました。

投稿者 るきお   (社会人)   投稿日時 2022/7/2 09:09:17
プロパティの設定についても抜けていましたね。失礼しました。

私はプロパティウィンドウで設定しましたが、ケンケンさんのようにプログラムで設定しても問題ありません。

魔界の仮面弁士さんの補足もありますが、このサンプルはやっつけで作っているので、本格的に採用される場合は、もう少しわかりやすくして、無駄を省くプログラムにするのが良いと思います。
既に出ている指摘以外では、座標の指定が開発・メンテしにくいですね。

たぶん実際には罫線を付けたりもすると思うので、よりこのあたりを最初のうちからスマートに書ければよいなと思います。


投稿者 ケンケン   (社会人)   投稿日時 2022/7/3 08:07:20
たかがC# されどC# 奥が深い