none
Default PrinterResolutions

    Frage

  • Hallo zusammen,

    ich lese in eine ComboBox die Printer Reslolutions ein.

    ' Add list of printer resolutions found on the printer to the combobox.
            ' The PrinterResolution's ToString() method will be used to provide the display string.
            comboPrintResolution.DisplayMember = "PrinterResolutions"
            For i = 0 To PrintDocument_.PrinterSettings.PrinterResolutions.Count - 1
                comboPrintResolution.Items.Add(PrintDocument_.PrinterSettings.PrinterResolutions.Item(i))
            Next

    Das geht ja.
    Nun möchte ich aber nach dem die ComboBox gefüllt ist, den Eintrag selektieren, der auch als Default eingestellt ist.

    Abfragen welche es gibt

    For i = 0 To PrintDocument_.PrinterSettings.PrinterResolutions.Count - 1
                If PrintDocument_.PrinterSettings.PrinterResolutions(i).Kind = System.Drawing.Printing.PrinterResolutionKind.Custom Then
    
                ElseIf PrintDocument_.PrinterSettings.PrinterResolutions(i).Kind = System.Drawing.Printing.PrinterResolutionKind.Draft Then
    
                ElseIf PrintDocument_.PrinterSettings.PrinterResolutions(i).Kind = System.Drawing.Printing.PrinterResolutionKind.High Then
    
                ElseIf PrintDocument_.PrinterSettings.PrinterResolutions(i).Kind = System.Drawing.Printing.PrinterResolutionKind.Low Then
    
                ElseIf PrintDocument_.PrinterSettings.PrinterResolutions(i).Kind = System.Drawing.Printing.PrinterResolutionKind.Medium Then
    
                End If
            Next

    Aber wie frage ich welche Resolution als Standart eingestellt ist, um damit die ComboBox Voreinstellung zu machen ?

    vielen dank

    Freitag, 26. April 2013 10:25

Antworten

  • Hallo Ionut,

    danke für den Link. Das hatte ich aber bereits oben gepostet.

    Ich bin aber fündig geworden.

     Dim PageResolution As PrinterResolution = PageSettings_.PrinterResolution
     comboPrintResolution.Text = PageResolution.ToString

    trotzdem vielen dank
    Freitag, 26. April 2013 15:34
  • Hallo Bernd,

    die PrinterResultion verwendet ein Enum "mißbräuchlich". Für die Standard-Auflösungen werden die Werte -4 .. -1 verwendet. Die "Custom" Werte beginnen bei 0 und folgende. Für Vergleiche kannst Du somit auf PrinterResultionKind >= 0 oder PrinterResolutionKinde < 0 abfragen. Bei Bedarf kann man es über CInt() als Integer behandeln und via CType(Variable, PrinterResolutionKind) umwandeln.

    Damit die ComboBox deutsch spricht, kann man die Datenbindung verwenden. Zunächst erstellt man sich eine Auflistung (hier mit Hilfe von Tuple):

        Private Function GetPrinterResolutionList(settings As PrinterSettings) As List(Of Tuple(Of PrinterResolutionKind, String))
            Dim list As New List(Of Tuple(Of PrinterResolutionKind, String))
            For Each res As PrinterResolution In settings.PrinterResolutions
                Dim value As String = String.Empty
                Select Case res.Kind
                    Case PrinterResolutionKind.Draft : value = "Entwurf"
                    Case PrinterResolutionKind.Low : value = "Niedrige Auflösung"
                    Case PrinterResolutionKind.Medium : value = "Mittlere Auflösung"
                    Case PrinterResolutionKind.High : value = "Hohe Auflösung"
                    Case Else
                        value = String.Format("{0} * {1} dpi", res.X, res.Y)
                End Select
                list.Add(Tuple.Create(res.Kind, value))
            Next
            Return list
        End Function
    
    

    Die bindet man an die ComboBox:

            Dim pdoc As New PrintDocument() ' Dummy
    
            Dim resolutionList = GetPrinterResolutionList(pdoc.PrinterSettings)
            Me.printerResolutionComboBox.DataSource = GetPrinterResolutionList(pdoc.PrinterSettings)
            Me.printerResolutionComboBox.ValueMember = "Item1"
            Me.printerResolutionComboBox.DisplayMember = "Item2"
    
            Dim defaultResolution = pdoc.PrinterSettings.DefaultPageSettings.PrinterResolution
            Me.printerResolutionComboBox.SelectedIndex = resolutionList.FindIndex(Function(value) value.Item1 = CInt(defaultResolution.Kind))
            ' Console.WriteLine("Standard Auflösung:" & defaultResolution.Kind)
    

    Und im SelectedIndex hat man dann die Werte:

        Private Sub printerResolutionComboBox_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) _
            Handles printerResolutionComboBox.SelectedIndexChanged
            Dim combo = DirectCast(sender, ComboBox)
            If combo.SelectedIndex >= 0 Then
                Dim item = DirectCast(combo.SelectedItem, Tuple(Of PrinterResolutionKind, String))
                ' Item1 enthält PrinterResolutionKind
                ' Item2 den Text
                If item.Item1 >= PrinterResolutionKind.Custom Then
                    Console.WriteLine("Benutzerdefiniert: {0}", item.Item2)
                Else
                    Console.WriteLine("Standard: {0}", item.Item1)
                End If
            End If
        End Sub

    Wobei bei Dir anstatt Console.WriteLine die Zuweisung an die PageSettings.PrinterResolution bzw. eine andere Variable erfolgen würde.

    Gruß Elmar



    Freitag, 26. April 2013 15:44
    Beantworter

Alle Antworten

  • Freitag, 26. April 2013 14:22
    Besitzer
  • Hallo Ionut,

    danke für den Link. Das hatte ich aber bereits oben gepostet.

    Ich bin aber fündig geworden.

     Dim PageResolution As PrinterResolution = PageSettings_.PrinterResolution
     comboPrintResolution.Text = PageResolution.ToString

    trotzdem vielen dank
    Freitag, 26. April 2013 15:34
  • Hallo Bernd,

    die PrinterResultion verwendet ein Enum "mißbräuchlich". Für die Standard-Auflösungen werden die Werte -4 .. -1 verwendet. Die "Custom" Werte beginnen bei 0 und folgende. Für Vergleiche kannst Du somit auf PrinterResultionKind >= 0 oder PrinterResolutionKinde < 0 abfragen. Bei Bedarf kann man es über CInt() als Integer behandeln und via CType(Variable, PrinterResolutionKind) umwandeln.

    Damit die ComboBox deutsch spricht, kann man die Datenbindung verwenden. Zunächst erstellt man sich eine Auflistung (hier mit Hilfe von Tuple):

        Private Function GetPrinterResolutionList(settings As PrinterSettings) As List(Of Tuple(Of PrinterResolutionKind, String))
            Dim list As New List(Of Tuple(Of PrinterResolutionKind, String))
            For Each res As PrinterResolution In settings.PrinterResolutions
                Dim value As String = String.Empty
                Select Case res.Kind
                    Case PrinterResolutionKind.Draft : value = "Entwurf"
                    Case PrinterResolutionKind.Low : value = "Niedrige Auflösung"
                    Case PrinterResolutionKind.Medium : value = "Mittlere Auflösung"
                    Case PrinterResolutionKind.High : value = "Hohe Auflösung"
                    Case Else
                        value = String.Format("{0} * {1} dpi", res.X, res.Y)
                End Select
                list.Add(Tuple.Create(res.Kind, value))
            Next
            Return list
        End Function
    
    

    Die bindet man an die ComboBox:

            Dim pdoc As New PrintDocument() ' Dummy
    
            Dim resolutionList = GetPrinterResolutionList(pdoc.PrinterSettings)
            Me.printerResolutionComboBox.DataSource = GetPrinterResolutionList(pdoc.PrinterSettings)
            Me.printerResolutionComboBox.ValueMember = "Item1"
            Me.printerResolutionComboBox.DisplayMember = "Item2"
    
            Dim defaultResolution = pdoc.PrinterSettings.DefaultPageSettings.PrinterResolution
            Me.printerResolutionComboBox.SelectedIndex = resolutionList.FindIndex(Function(value) value.Item1 = CInt(defaultResolution.Kind))
            ' Console.WriteLine("Standard Auflösung:" & defaultResolution.Kind)
    

    Und im SelectedIndex hat man dann die Werte:

        Private Sub printerResolutionComboBox_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) _
            Handles printerResolutionComboBox.SelectedIndexChanged
            Dim combo = DirectCast(sender, ComboBox)
            If combo.SelectedIndex >= 0 Then
                Dim item = DirectCast(combo.SelectedItem, Tuple(Of PrinterResolutionKind, String))
                ' Item1 enthält PrinterResolutionKind
                ' Item2 den Text
                If item.Item1 >= PrinterResolutionKind.Custom Then
                    Console.WriteLine("Benutzerdefiniert: {0}", item.Item2)
                Else
                    Console.WriteLine("Standard: {0}", item.Item1)
                End If
            End If
        End Sub

    Wobei bei Dir anstatt Console.WriteLine die Zuweisung an die PageSettings.PrinterResolution bzw. eine andere Variable erfolgen würde.

    Gruß Elmar



    Freitag, 26. April 2013 15:44
    Beantworter
  • Hallo Elmar,
    vorab vielen dank für das tolle Beispiel. 
    Kann mann solche Beispiele eigentlich nicht an die Beschreibung der MSDN Libary anhängen ?
    Damit währe einigen sehr geholfen.

    Jetzt hast du mir wieder mal Hausaufgaben aufgegeben. Cool und Danke.

    Tuple kenne ich garnicht. Klar ich arbeite ja auch mit 3,5.
    Ich habe mir da, wenn es sich um verschiedene Objekte handelt, immer mit einer kleinen Klassen weitergeholfen.
    Das schaue ich mir noch mal genauer an.

    Die ComboBox an eine DatenQuelle binden, kenne ich nur aus dem Bereich DataGridView.
    So habe ich das noch nie verwendet. Was aber gut zu wissen ist.

    Das wo ich nach gesucht habe war in deinem Fall diese Zeile.

    Me.printerResolutionComboBox.SelectedIndex = resolutionList.FindIndex(Function(value) value.Item1 = CInt(defaultResolution.Kind))

    Die ich in FW 3,5 wie folgt dann doch noch gefunden hatte.

    Dim PageResolution As PrinterResolution = PageSettings_.PrinterResolution
    comboPrintResolution.Text = PageResolution.ToString
    OK ich war über den String gegangen und nicht über den Index.

    Ich versuche das mal in FW 3,5 umzusetzen.

    vielen dank wie immer

    Freitag, 26. April 2013 19:48