none
Crystal Report での給紙トレイ変更について RRS feed

  • 質問

  • 初めまして。

    Windows 10 PRO 64bitで、VS2017 Community C# とCrystal ReportでWindows Formsアプリケーションを開発しておりますが、印刷時の給紙トレイの変更がうまく行かず、おわかりになる方がいらっしゃいましたらアドバイスをお願いできますでしょうか?

    プリンタの給紙設定は「自動」になっており、これを実行時に2段目カセット(中段)に変更しようと思い、以下の①~③のコーディングを個々に試しましたが、いずれも「自動」のまま給紙されてしまいます。
    ※給紙トレイは「自動」「手差し」「カセット1」「カセット2」の順で、目的の「カセット2」のインデックスは3です

    ◆クリレポビュアーを貼っただけのフォームです
    private void Form_Load(object sender, EventArgs e)
    {
        System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();

        // ①
        //pd.DefaultPageSettings.PaperSource = pd.PrinterSettings.PaperSources[3];

        ReportDocument rep = new ReportDocument();

        DataSet dset = // 省略

        rep.Load("C:\TEST\TEST.RPT");

        rep.SetDataSource(dset);

        // ②
        //rep.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Middle;

        // ③
        //rep.PrintOptions.CustomPaperSource = pd.PrinterSettings.PaperSources[3];

        crystalReportViewer1.ReportSource = rep;
    }

    以上、よろしくお願いいたします。
    2021年11月28日 8:32

回答

  • プリンタの動作設定を行うための情報をもっている DEVMODE 構造体というのがあります。
    この構造体には、定義済みメンバーとドライバー定義メンバーがあります。

    「DEVMODEW 構造体」
    https://docs.microsoft.com/ja-jp/windows-hardware/drivers/display/the-devmodew-structure

    定義済みメンバーの部分は、たいてのプリンタに共通で実装されていますが、ドライバー定義メンバーの部分は各プリンタで違っているため昔から悩みの種だったりします。(そのために設定用画面がプリンタドライバーに付属しているわけです)

    「プリンタの用紙の種類をプログラムで設定したい」
    https://dobon.net/vb/bbs/log3-47/28144.html

    にあるように、DEVMODE 構造体のドライバー定義メンバーがどのように使われているか調べて設定することもできますが、プリンタが変わると使えなくなってしまう可能性があります。

    なので、プリンタ名(カセット1)、プリンタ名(トレイ2)のように、デフォルトの用紙設定が違うものを用意し、印刷先を変えるようにするといいかもしれません。

    2021年11月28日 9:17

すべての返信

  • プリンタの動作設定を行うための情報をもっている DEVMODE 構造体というのがあります。
    この構造体には、定義済みメンバーとドライバー定義メンバーがあります。

    「DEVMODEW 構造体」
    https://docs.microsoft.com/ja-jp/windows-hardware/drivers/display/the-devmodew-structure

    定義済みメンバーの部分は、たいてのプリンタに共通で実装されていますが、ドライバー定義メンバーの部分は各プリンタで違っているため昔から悩みの種だったりします。(そのために設定用画面がプリンタドライバーに付属しているわけです)

    「プリンタの用紙の種類をプログラムで設定したい」
    https://dobon.net/vb/bbs/log3-47/28144.html

    にあるように、DEVMODE 構造体のドライバー定義メンバーがどのように使われているか調べて設定することもできますが、プリンタが変わると使えなくなってしまう可能性があります。

    なので、プリンタ名(カセット1)、プリンタ名(トレイ2)のように、デフォルトの用紙設定が違うものを用意し、印刷先を変えるようにするといいかもしれません。

    2021年11月28日 9:17
  • KOZ6.0 様、回答どうもありがとうございます。

    返信が遅くなり、申し訳ありませんでした。

    貼っていただいた2つ目のリンクについては自分も参照し、
    >給紙トレイは、
    >printDoc.DefaultPageSettings.PaperSource = printDoc.PrinterSettings.PaperSources[ToreyNum];
    の部分から、プロパティから簡単にできるものと考えておりました。
    やはりDEVMODEW 構造体なるものを使わないとできない(使っても難しい)のですね。

    プリンタの切り替えについては実装しておりますので、今回はご教示いただいた「デフォルト用紙の違うプリンタを用意して切り替える」方法で進めたいと思います。

    どうもありがとうございました。
    2021年11月29日 23:07