|
■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
|