DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザー定義の用紙サイズを指定するには?

環境/言語:[C# Framework Ver1.1]
分類:[.NET]

現在帳票を印刷するプログラムを書いています。
それで前回の設定を保存しておいて、読み込んで使用するという処理を書いているんですが、ユーザー定義の場合のみ反映されません。

PrinterSettings ps = this.Document.Printer.PrinterSettings;
ps.PrinterName = "プリンタ名";

foreach (PaperSize ppSize in ps.PaperSizes)
{
  if (ppSize.Kind == PaperKind.Custom)
  {
    ps.DefaultPageSettings.PaperSize = ppSize;
    break;
  }
}

ps.DefaultPageSettings.PaperSize = new PaperSize("会計伝票", 幅, 高さ);

としてるのですが、ユーザー定義サイズになってたり、なってなかったり。
ユーザ定義になってても指定した幅、高さになっていなかったりします。

それで色々やってみて、
ps.DefaultPageSettings.PaperSize = ppSize;
の時は確かにユーザ定義になっているので、このあと
PaperSize.Width、.Heightで値をセットできれば反映されるのだと思います。
しかし、PaperSize.KindがCustomになっているにもかかわらず、
「PaperSize の Kind が Custom でない限り、PaperSize を変更できません。」
とエラーが出てしまい、直接の指定は出来ません。
PaperSizeを新規で登録してもダメ、現在の設定の変更もダメとなりお手上げ状態です。

ドライバの問題と言ってしまえばそれまでかも知れませんが、何か解決策があればお願いします。
■No16309に返信(ファイさんの記事)

過去ログは検索されましたか?同じ質問が過去ログにあります。

PaperSizeのKindがCustumなのにPaperSizeを変更できない
http://dobon.net/vb/bbs/log3-20/12331.html

ちなみに、このようなバグが.NET Framework 1.0にはあったようですが、1.1で修正されたようです。詳しくは、次のURLにあります。

http://groups.google.com/group/microsoft.public.dotnet.framework.drawing/browse_frm/thread/07438628ac244c02/d23c10943b35c6fa?tvc=1#d23c10943b35c6fa
>管理人様
「http://dobon.net/vb/bbs/log3-20/12331.html」の過去ログはすでに拝見しておりました。
しかし、きっちりと解決しないまま終わっており問題を解決することは出来ませんでした。

FrameworkはVersion1.1を使用しておりますので、下のURLの問題ではないと思われます。

印刷ダイアログ表示前にPrinterSettingsに用紙サイズをセットし、
それがダイアログ上で反映されるかチェックしていました。
しかし、印刷ダイアログ上でも反映されていませんでした。
先ほど試してて思ったのですが、
PrinterSettings ps = this.Document.Printer.PrinterSettings;
ps.PrinterName = "プリンタ名";

foreach (PaperSize ppSize in ps.PaperSizes)
{
  if (ppSize.PaperName == "プリンタのユーザ定義の名前")
  {
    ps.DefaultPageSettings.PaperSize = ppSize;
    break;
  }
}
の「ps.DefaultPageSettings.PaperSize = ppSize;」
で止めておけばプリンタダイアログではユーザ定義になりました。
おそらくプリンタにある用紙サイズをそのまま使ったので問題が無かったという事なんでしょう。
けど、当然サイズをデフォルトから変えたいので
ps.DefaultPageSettings.PaperSize.Width = 100;
などでサイズを変えようとすると「PaperSize の Kind が Custom でない限り、PaperSize を変更できません」
とエラーが出てしまいます。
PaperSizeのKindがCustomになっているにも係わらずエラーになるというのは
バグでしょうか?
ここさえ解決できれば問題も解決するように思うのですが・・・
私もこの件に関しては試行錯誤したのですが解決できず、
事前にWin32Apiでユーザー定義用紙のサイズを変更することで回避しました。

GetForm() //ユーザー定義用紙を取得
if(ユーザー定義用紙がない)
{
AddForm() //ユーザー定義用紙を追加
}
else
{
SetForm() //ユーザー定義用紙を変更
}

・・・
> 事前にWin32Apiでユーザー定義用紙のサイズを変更することで回避しました。
やはりAPIを使うしかないですか・・・
自分なりに
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16795&forum=7
を参考にしてやってみましたが、なりませんでした。

現在C#すらも手探り状態でやっているもので、もしよろしければ参考になるHP、ソースなどを教えていただければありがたいのですが・・・。
検索しても参考になるものが見つからないものでして・・・
あつかましいお願いですいません。
■No16334に返信(ファイさんの記事)

>「http://dobon.net/vb/bbs/log3-20/12331.html」の過去ログはすでに拝見しておりました。
>しかし、きっちりと解決しないまま終わっており問題を解決することは出来ませんでした。

事前に調べられたことは、出し惜しみをせずに、お書き添えください。そうでないと、余計な手間がかかってしまいます。

> 現在C#すらも手探り状態でやっているもので、もしよろしければ参考になるHP、ソースなどを教えていただければありがたいのですが・・・。

過去ログのVB.NETのコードを

DOBON.NET .NET Tips - VB.NETのコードをC#へ変換する
http://dobon.net/vb/dotnet/links/convertvb2cs.html

で紹介しているようなツールを使ってC#に変換してみてください。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16795&forum=7

参考までに・・・

DOBON.NET | プログラミング道 | プログラミング掲示板