none
:.NET Framework2.0でPageSetupDialog表示時にCustum用紙を既定値に出来ない RRS feed

  • 質問

  • .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のバグなのでしょうか?

    正しく動作するようにするための情報をお持ちの方がおられましたら、お教えください。
    よろしくお願いします。

    2008年7月2日 2:38

すべての返信

  • psDlg.ShowDialog();
    を行うまでに
    pageSet.PrinterSettings = prtSet;
    を実行すると正常にならないでしょうか?
    こちらではこれで正しく動作するようでした。

     

    書かれたコードでは、pageSet.PrinterSettings は「通常使うプリンタ」で、prtSet は指定された "プリンタ名" のプリンタになると思います。

    pageSet.PaperSize = GetPaperSize(prtSet, @"Custum用紙の名前");

    というコードでは、指定プリンタの用紙サイズを取得して「通常使うプリンタ」の用紙サイズとして指定することになるのでは?と思います(そして PageSetupDialog は prtSet のプリンタとして振る舞う…)。

    すると 1.1 で動作することの方が疑問に思えたためいろいろ調べたのですが、わかりませんでした。

     

    以下のように PageSettings の PrinterSettings をそのまま使用すると、ややこしくならないと思います。

    # PageSetupDialog.PrinterSettings が未指定の場合、PageSettings.PrinterSettings がダイアログで使用されます。

    # ただし、ページ設定ダイアログの「プリンタの設定」ボタンは無効になります。

     

    Code Snippet

    System.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();

     

    2008年7月2日 10:57
  • TH01さん、レスありがとうございます。

    指摘のとおり、試してみたのですが、やはり、同現象が発生します。

    ただ、プリンタを変えて試してみると、ご指摘のとおり正しく動作しました。

     

    正しく動作したプリンタ

    CanonのLBP-3600(レーザープリンタ)をネットワーク接続

     

    正しく動作しないプリンタ

    EPSONのVP-1850(ドットプリンタ)をサーバで共有し接続(サーバへはシリアル接続)

     

    プリンタドライバ依存かとも思われるのですが、Framework1.1では正しく動作していたので、

    Framework2.0になって、PageSetupDialogの内部ロジックが変わっているのでしょうか・・・

     

    2008年7月3日 5:44
  • 「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 など何種類かのプリンタでは必ず不具合が発生することを強調して伝えられると良いかもしれないと思いました。

    2008年7月3日 12:05
  • 追加情報です。
    プリンタ固有の用紙サイズ選択画面がなく、標準の「詳細オプション」画面で用紙サイズを選択するようになっているプリンタが、今回の不具合現象が発生するプリンタかもしれないと思いました。

     

    また、以下のようなコードで「印刷」ダイアログを使用した場合は、既定選択用紙の指定動作や、選択変更後の PaperSize の値は正しくなっていました。

     

    Code Snippet

    PrinterSettings 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());

     

    2008年7月4日 0:24
  • 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 Snippet

    PrinterSettings 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());

    ほんとですねぇ。

    印刷ダイアログだと反映されていますねぇ。

     

    2008年7月7日 4:45
  • こんにちは、フォーラムオペレータの田中麻記子です。

     

    さなさん、お問い合わせありがとうございます。
    TH01さん、回答ありがとうございます、しかもUSのサイトまで調べていただいたようで恐縮です。

     

    こちらの件は、さなさんからConnectというフィードバックセンターへご連絡頂いてる件ですよね。
    http://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=354662

    せっかくフィードバックを頂いたのですが、該当のプリンタ(EPSON)が用意できずラボの方で再現が確認できない、という残念な回答でした。。。。すいません。

    よろしければ、この件その後の進捗状況や変化、もしくは上記の3機種以外のプリンタでの結果などございましたらご連絡いただけると幸いです。

     

    よろしくお願いします。

     

    2008年12月11日 2:45