C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: PrintDialogのページ指定の設定が反映されない


(過去ログ 103 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■61282 / inTopicNo.1)  PrintDialogのページ指定の設定が反映されない
  
□投稿者/ 五右衛門 (9回)-(2011/08/08(Mon) 14:24:42)

分類:[VB.NET/VB2005 以降] 

(開発言語:VB2008)
いつもお世話になっております。

印刷時に印刷ダイアログを表示して、ページ指定を行えるようにしたのですが、
1回印刷した後、2回目の印刷を行うために印刷ダイアログを表示しようとすると、
PrintDialogのAllowSomePagesをTrueにしているにも関わらず、
ページ指定のラジオボタンを選択できないようになってしまいます。

フォームのレイアウトは以下の通りです。

■frmMain(メインフォーム)
 デザイナ上に以下のコントロールを貼り付け
 ・PrintDocument
 ・その他ボタン

■dlgMyPreview(自作プレビューダイアログ)
 デザイナ上に以下のコントロールを貼り付け
 ・PrintPreviewControl
 ・PrintDialog
 ・PageSetupDialog(今回はこのダイアログを開いていませんが、念のため掲載)
 ・その他ボタン


現象は以下の通りです。
1.frmMainフォーム上のボタンをクリックし、クリックイベントでdlgMyPreviewダイアログをShowDialogで表示する。
  この時、dlgMyPreviewにPrintDocumentを渡し、dlgMyPreview内部のPrivate変数に格納する。
  (これは、PrintPreviewControlやPrintDialogのDocumentプロパティに渡すための変数です。)
2.dlgMyPreviewダイアログ上のボタンをクリックし、クリックイベントでPrintDialogのAllowSomePagesをTrueにして、
  このダイアログを開く。
  ページ指定は1ページのみを指定し、印刷を行う。
  印刷後は、自動的にdlgMyPreviewが閉じる。
3.再度上記1.2.を行うと、PrintDialogのAllowSomePagesをTrueにしているにも関わらず、印刷ダイアログのページ指定
  ラジオボタンが選択できないようになってしまう。

なお、上記2.の時に、ページ指定を選択せず、前ページを選択して印刷を行った場合、上記3.を行うと、
ページ指定ラジオボタンは選択することができます。
また、別フォームfrmOwnerを用意し、frmOwnerからfrmMainを開き、上記1.2.を行い、frmMainを一度閉じ、再度frmOwnerから
frmMainを開き、上記3.を実行するとページ指定ラジオボタンは選択することができます。

考えられる原因はありますでしょうか?
アドバイスの程、よろしくお願いします。
引用返信 編集キー/
■61290 / inTopicNo.2)  Re[1]: PrintDialogのページ指定の設定が反映されない
□投稿者/ 五右衛門 (10回)-(2011/08/08(Mon) 16:48:50)
あれから色々と調べた結果、frmMain(メインフォーム)から自作プレビューダイアログdlgMyPreviewを表示する際、
frmMainで使用しているPrintDocumentを新しいインスタンスにすれば(その代わり、デザイナ上にPrintDocumentを貼り付けるのをやめる)
上記1.2.の実行後、上記3.を実行しても、印刷ダイアログ上のページ指定ラジオボタンを選択することが可能になりました。
ただし、この場合、初回のプレビュー時に変更したページ設定(具体的には、自作プレビューダイアログdlgMyPreview上に配置した
PageSetupDialogでページ設定を行う)が、次回のプレビュー時にはリセットされてしまいます。
初回のページ設定の内容を保持しつつ、印刷ダイアログのページ指定ラジオボタンを常に選択できるようにするにはどうすればよいでしょうか?

アドバイスの程、よろしくお願いします。
引用返信 編集キー/
■61324 / inTopicNo.3)  Re[2]: PrintDialogのページ指定の設定が反映されない
□投稿者/ 五右衛門 (11回)-(2011/08/09(Tue) 10:55:22)
自己レスです。
結局、新しいPrintDocumentインスタンスを作成するとき、前のPrintDocumentインスタンスの
DefaultPageSettingsやPrinterSettings内の必要パラメータを参照し、これを設定するようにして回避しました。

これにて解決と致しますが、もしも、最初の質問の、印刷ダイアログのページ指定ラジオボタンが選択できない
現象がお分かりの方がいらっしゃいましたらコメントをお願いします。
解決済み
引用返信 編集キー/
■61333 / inTopicNo.4)  Re[3]: PrintDialogのページ指定の設定が反映されない
□投稿者/ 魔界の仮面弁士 (2297回)-(2011/08/09(Tue) 13:32:23)
No61324 (五右衛門 さん) に返信
> 印刷ダイアログのページ指定ラジオボタンが選択できない現象

残念ながら、提示された手順だけでは判断が付きませんでした。

多分、どこかで変数の再初期化を忘れているだけだとは思うのですが、
現状のコードが書かれていないので、問題箇所を指摘することさえできません。


とりあえず、与えられた情報をもとにして適当なサンプルを書いてみました。

'------------------
'■frmMain(メインフォーム)
' デザイナ上に以下のコントロールを貼り付け
' ・PrintDocument
' ・その他ボタン
'
Imports System.Drawing.Printing

Public Class frmMain
    Private pageText() As String
    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Me.PrintDocument1.DocumentName = "サンプル"
        Me.その他.Text = "その他"
        'Me.pageText = Enumerable.Range(1, 10).Select(Function(n) String.Format("Page.{0}", n)).ToArray()
        Me.pageText = "あああ|いいい|ううう|えええ|おおお".Split("|"c)
    End Sub

    Private Sub その他_Click(ByVal sender As Object, ByVal e As EventArgs) Handles その他.Click
        '1.frmMainフォーム上のボタンをクリックし、クリックイベントでdlgMyPreviewダイアログをShowDialogで表示する。
        ' この時、dlgMyPreviewにPrintDocumentを渡し、dlgMyPreview内部のPrivate変数に格納する。
        '(これは、PrintPreviewControlやPrintDialogのDocumentプロパティに渡すための変数です。)
        Using dlg As New dlgMyPreview(Me.PrintDocument1)
            dlg.ShowDialog()
        End Using
    End Sub

    Private printingPage As Integer = 0

    Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As PrintEventArgs) Handles PrintDocument1.BeginPrint
        Me.PrintDocument1.PrinterSettings.MinimumPage = 1
        Me.PrintDocument1.PrinterSettings.MaximumPage = pageText.Length
        Me.printingPage = 0
    End Sub

    Private Sub PrintDocument1_EndPrint(ByVal sender As Object, ByVal e As PrintEventArgs) Handles PrintDocument1.EndPrint
        Me.printingPage = 0
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim maxIndex As Integer = UBound(pageText)
        Dim currentIndex As Integer = Me.printingPage
        With e.PageSettings.PrinterSettings
            If .PrintRange = PrintRange.SomePages Then
                If Me.printingPage = 0 Then
                    Me.printingPage = Math.Min(.FromPage, .ToPage)
                    currentIndex = Me.printingPage - 1
                Else
                    Me.printingPage += 1
                End If
                maxIndex = Math.Min(maxIndex, Math.Max(.FromPage, .ToPage) - 1)
            Else
                Me.printingPage += 1
            End If
        End With
        currentIndex = Math.Min(currentIndex, maxIndex)
        e.HasMorePages = currentIndex < maxIndex

        Dim printText As String = Me.pageText(currentIndex)
        Using f As New Font("MS Gothic", 36, FontStyle.Regular)
            e.Graphics.DrawString(printText, f, Brushes.Red, e.MarginBounds.Location)
        End Using
    End Sub
End Class



'------------------
'■dlgMyPreview(自作プレビューダイアログ)
' デザイナ上に以下のコントロールを貼り付け
' ・PrintPreviewControl
' ・PrintDialog
' ・PageSetupDialog(今回はこのダイアログを開いていませんが、念のため掲載)
' ・その他ボタン
Imports System.Drawing.Printing

Public Class dlgMyPreview
    Private Sub New()
        Me.New(Nothing)
    End Sub

    Private WithEvents doc As PrintDocument
    Friend Sub New(ByVal doc As PrintDocument)
        Me.doc = doc
        InitializeComponent()
        Me.PrintPreviewControl1.Document = Me.doc
        Me.PageSetupDialog1.Document = Me.doc
        If Me.doc IsNot Nothing Then
            NumericUpDown1.Value = 1
        End If
    End Sub

    Private Sub その他_Click(ByVal sender As Object, ByVal e As EventArgs) Handles その他.Click
        '
        '2.dlgMyPreviewダイアログ上のボタンをクリックし、クリックイベントで
        ' PrintDialogのAllowSomePagesをTrueにして、このダイアログを開く。
        ' ページ指定は1ページのみを指定し、印刷を行う。
        ' 印刷後は、自動的にdlgMyPreviewが閉じる。
        '
        Me.PrintDialog1.Reset()
        Me.PrintDialog1.PrinterSettings = Me.doc.PrinterSettings
        Me.PrintDialog1.AllowSomePages = True
        Me.PrintDialog1.AllowSelection = False
        Me.PrintDialog1.AllowCurrentPage = False
        Me.PrintDialog1.PrinterSettings.PrintRange = PrintRange.AllPages
        Me.PrintDialog1.PrinterSettings.FromPage = 1
        Me.PrintDialog1.PrinterSettings.ToPage = Me.doc.PrinterSettings.MaximumPage
        If Me.PrintDialog1.ShowDialog() = System.Windows.Forms.DialogResult.Cancel Then
            Return
        End If
        Me.doc.PrinterSettings = Me.PrintDialog1.PrinterSettings
        Me.doc.Print()
        Me.doc.PrinterSettings.PrintRange = PrintRange.AllPages
        Me.Close()
    End Sub

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles NumericUpDown1.ValueChanged
        RemoveHandler Me.NumericUpDown1.ValueChanged, AddressOf NumericUpDown1_ValueChanged
        Me.PrintPreviewControl1.StartPage = Math.Max(Me.NumericUpDown1.Value - 1, 0)
        Me.NumericUpDown1.Value = Me.PrintPreviewControl1.StartPage + 1
        AddHandler Me.NumericUpDown1.ValueChanged, AddressOf NumericUpDown1_ValueChanged
    End Sub
End Class

引用返信 編集キー/
■61335 / inTopicNo.5)  Re[4]: PrintDialogのページ指定の設定が反映されない
□投稿者/ 五右衛門 (12回)-(2011/08/09(Tue) 15:18:22)
No61333 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士様、いつもお世話になっております。
ご丁寧にコードを書いて頂き、ありがとうございます。
魔界の仮面弁士様のコードと当方のコードに大きな違いがありました。
それは、PrintDocumentのBeginPrint・EndPrint各イベントの処理を行っていなかったことです。
ここで設定の初期化を行っていないから、おかしな動きになったのかも知れません。

早速確認してみます。
取り急ぎ、お礼を申し上げます。
引用返信 編集キー/
■61340 / inTopicNo.6)  Re[5]: PrintDialogのページ指定の設定が反映されない
□投稿者/ 五右衛門 (13回)-(2011/08/09(Tue) 17:26:41)
自己レスです。
一度ページ指定で印刷を行った場合、魔界の仮面弁士様のコード例のように

> Me.doc.PrinterSettings.PrintRange = PrintRange.AllPages

のように、印刷後にPrintRangeをAllPageに戻さないといけないことが分かりました。
(その証拠に、初回プレビュー時に1ページ目のみを印刷した場合、2回目のプレビューで1ページ目しか表示することができませんでした。)

これにて解決です。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -