質問者
:.NET Framework2.0でPageSetupDialog表示時にCustum用紙を既定値に出来ない

質問
-
.NET Framework2.0でPageSetupDialog表示時にCustum用紙を既定値にすることが出来ません。
元々は、VS.NET2003を使用し、.NET Framework1.1(SP1)で正しく動作していたのですが、VS2005(Version 8.0.50727.762(SP.050727-7600)).NET Framework2.0(Version 2.0.50727)に移行すると、動作しなくなりました。
以下に、コードを添付します。
コード:
private void button1_Click(object sender, EventArgs e) { PageSetupDialog psDlg = new PageSetupDialog(); //ページ設定ダイアログ System.Drawing.Printing.PageSettings pageSet = new System.Drawing.Printing.PageSettings(); //ページ設定 System.Drawing.Printing.PrinterSettings prtSet = new System.Drawing.Printing.PrinterSettings(); //プリンタ設定 prtSet.PrinterName = @"プリンタ名"; pageSet.PaperSize = GetPaperSize(prtSet, @"Custum用紙の名前"); //pageSet.PaperSize = GetPaperSize(prtSet, "A4"); pageSet.Landscape = true; psDlg.PrinterSettings = prtSet; psDlg.PageSettings = pageSet; psDlg.ShowDialog(); } /// <summary> /// PrinterSettingsオブジェクトのPaperSizesから指定した用紙名のPaperSizeオブジェクトを取得する。 /// </summary> /// <param name="PrtSet">PrinterSettingsオブジェクト</param> /// <param name="PaperName">用紙名</param> /// <returns>取得した用紙のPaperSizeオブジェクト(該当無しの場合、null)</returns> private static System.Drawing.Printing.PaperSize GetPaperSize(System.Drawing.Printing.PrinterSettings PrtSet, string PaperName) { System.Drawing.Printing.PaperSize psGet = null; foreach (System.Drawing.Printing.PaperSize psWork in PrtSet.PaperSizes) { if (psWork.PaperName == PaperName) { psGet = psWork; break; } } return psGet; }
prtSet.PrinterName = @"プリンタ名";
pageSet.PaperSize = GetPaperSize(prtSet, @"Custum用紙の名前");
部分にプリンタ名とそのプリンタに登録されているカスタム用紙名をセットします。
VS.NET2003では正しく動作するのですが、VS2005ではPaperSizesコレクションの最初の用紙が既定値になります。
また、カスタム用紙ではなく、既存用紙(たとえばA4等)を指定すると、正しく既定値になります。
.NET Framework2.0を使用するには、何かコードが足りないのでしょうか?
それとも、.NET Frameworkのバグなのでしょうか?
正しく動作するようにするための情報をお持ちの方がおられましたら、お教えください。
よろしくお願いします。
すべての返信
-
psDlg.ShowDialog();
を行うまでに
pageSet.PrinterSettings = prtSet;
を実行すると正常にならないでしょうか?
こちらではこれで正しく動作するようでした。書かれたコードでは、pageSet.PrinterSettings は「通常使うプリンタ」で、prtSet は指定された "プリンタ名" のプリンタになると思います。
pageSet.PaperSize = GetPaperSize(prtSet, @"Custum用紙の名前");
というコードでは、指定プリンタの用紙サイズを取得して「通常使うプリンタ」の用紙サイズとして指定することになるのでは?と思います(そして PageSetupDialog は prtSet のプリンタとして振る舞う…)。
すると 1.1 で動作することの方が疑問に思えたためいろいろ調べたのですが、わかりませんでした。
以下のように PageSettings の PrinterSettings をそのまま使用すると、ややこしくならないと思います。
# PageSetupDialog.PrinterSettings が未指定の場合、PageSettings.PrinterSettings がダイアログで使用されます。
# ただし、ページ設定ダイアログの「プリンタの設定」ボタンは無効になります。
Code SnippetSystem.Drawing.Printing.PageSettings pageSet = new System.Drawing.Printing.PageSettings();
pageSet.PrinterSettings.PrinterName = @"プリンタ名";
pageSet.PaperSize = GetPaperSize(pageSet.PrinterSettings, @"Custum用紙の名前");
pageSet.Landscape = true;PageSetupDialog psDlg = new PageSetupDialog();
psDlg.PageSettings = pageSet;
psDlg.ShowDialog(); -
TH01さん、レスありがとうございます。
指摘のとおり、試してみたのですが、やはり、同現象が発生します。
ただ、プリンタを変えて試してみると、ご指摘のとおり正しく動作しました。
正しく動作したプリンタ
CanonのLBP-3600(レーザープリンタ)をネットワーク接続
正しく動作しないプリンタ
EPSONのVP-1850(ドットプリンタ)をサーバで共有し接続(サーバへはシリアル接続)
プリンタドライバ依存かとも思われるのですが、Framework1.1では正しく動作していたので、
Framework2.0になって、PageSetupDialogの内部ロジックが変わっているのでしょうか・・・
-
「VP-1850」が入っているコンピュータがあったので試してみたところ、確かに仰るとおりでした。
その上、ページ設定ダイアログで用紙を指定しても、それが PaperSize プロパティには反映されないようでした。
どちらの現象についても、「IBM 5579-H02/K02」というプリンタ(ドットプリンタ)でも同様に発生しました。
同様の現象について調べたら、3年前の、さなさんの投稿が見つかってビックリしました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19652&forum=7
この、ページ設定ダイアログでの用紙の選択結果が取得できない方が問題に思いますが、この件は解決できたのでしょうか?US の フィードバックや MSDN フォーラムで同様の話がないかについて調べてみたのですが、有効なものは見つけられませんでした。
さなさんは既にフィードバックされていますが、「再現不可能」になってしまわないように、正常に動作するプリンタも存在するが VP-1850 など何種類かのプリンタでは必ず不具合が発生することを強調して伝えられると良いかもしれないと思いました。
-
追加情報です。
プリンタ固有の用紙サイズ選択画面がなく、標準の「詳細オプション」画面で用紙サイズを選択するようになっているプリンタが、今回の不具合現象が発生するプリンタかもしれないと思いました。また、以下のようなコードで「印刷」ダイアログを使用した場合は、既定選択用紙の指定動作や、選択変更後の PaperSize の値は正しくなっていました。
Code SnippetPrinterSettings printerSettings = new PrinterSettings();
printerSettings.PrinterName = @"プリンタ名";
printerSettings.DefaultPageSettings.PaperSize = GetPaperSize(printerSettings, @"Custum用紙の名前");PrintDialog printDialog = new PrintDialog();
printDialog.PrinterSettings = printerSettings;
printDialog.ShowDialog();MessageBox.Show(printerSettings.DefaultPageSettings.PaperSize.ToString());
-
TH01さん、再びのレスありがとうございます。
TH01 さんからの引用 同様の現象について調べたら、3年前の、さなさんの投稿が見つかってビックリしました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19652&forum=7
この、ページ設定ダイアログでの用紙の選択結果が取得できない方が問題に思いますが、この件は解決できたのでしょうか?US の フィードバックや MSDN フォーラムで同様の話がないかについて調べてみたのですが、有効なものは見つけられませんでした。
さなさんは既にフィードバックされていますが、「再現不可能」になってしまわないように、正常に動作するプリンタも存在するが VP-1850 など何種類かのプリンタでは必ず不具合が発生することを強調して伝えられると良いかもしれないと思いました。
@ITへ投稿した件は、結局解決にはいたらず、プリンタ変更時は、プリンタ変更後、一旦、ページ設定画面を閉じてもらい、再度、ページ設定にて用紙の設定を行う運用で逃げました(汗)
TH01 さんからの引用 追加情報です。
プリンタ固有の用紙サイズ選択画面がなく、標準の「詳細オプション」画面で用紙サイズを選択するようになっているプリンタが、今回の不具合現象が発生するプリンタかもしれないと思いました。フィードバックにはTH01さんから頂いた、上記の追加情報を元にコメントを追加しておきます。
TH01 さんからの引用 また、以下のようなコードで「印刷」ダイアログを使用した場合は、既定選択用紙の指定動作や、選択変更後の PaperSize の値は正しくなっていました。
Code SnippetPrinterSettings printerSettings = new PrinterSettings();
printerSettings.PrinterName = @"プリンタ名";
printerSettings.DefaultPageSettings.PaperSize = GetPaperSize(printerSettings, @"Custum用紙の名前");PrintDialog printDialog = new PrintDialog();
printDialog.PrinterSettings = printerSettings;
printDialog.ShowDialog();MessageBox.Show(printerSettings.DefaultPageSettings.PaperSize.ToString());
ほんとですねぇ。
印刷ダイアログだと反映されていますねぇ。
-
こんにちは、フォーラムオペレータの田中麻記子です。
さなさん、お問い合わせありがとうございます。
TH01さん、回答ありがとうございます、しかもUSのサイトまで調べていただいたようで恐縮です。こちらの件は、さなさんからConnectというフィードバックセンターへご連絡頂いてる件ですよね。
http://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=354662せっかくフィードバックを頂いたのですが、該当のプリンタ(EPSON)が用意できずラボの方で再現が確認できない、という残念な回答でした。。。。すいません。
よろしければ、この件その後の進捗状況や変化、もしくは上記の3機種以外のプリンタでの結果などございましたらご連絡いただけると幸いです。
よろしくお願いします。