4 Stimmen

Winforms-Steuerelement zur Anzeige von Text und zur Unterstützung der Einfärbung einzelner Zeilen

Für eine Winforms-Anwendung suche ich ein Steuerelement, das Text anzeigen kann und individuelle Zeilenfarben (Vorder- und Hintergrundfarben pro Zeile) unterstützt.

Ich möchte zum Beispiel, dass Zeile 1 eine grüne Hintergrundfarbe hat und Zeile 4 eine rote.

7voto

adrianbanks Punkte 78849

A ListView Kontrolle ist wahrscheinlich die einfachste Sache für das, was Sie brauchen (solange es nur für die Anzeige ist). Setzen Sie seine Siehe Eigenschaft zu List . Jeder Artikel ist ein ListViewItem , auf dem Sie die Einstellung im Vordergrund y Hintergrund Farben.

2voto

Stewbob Punkte 16520

In der Vergangenheit habe ich eine benutzerdefinierte Combobox für diese Art der Steuerung verwendet.  Ich setze den DrawMode im Konstruktor auf OwnerDrawVariable und überschreibe die Methode OnDrawItem.  Auf diese Weise können Sie den Hintergrund für jedes Element in der Combobox mit einer beliebigen Farbe oder einem beliebigen Stil zeichnen, die Sie wünschen.

Der folgende Code zeichnet jedes andere Element mit einem grauen Hintergrund, wie die Bilder in diese Stelle Dieses Beispiel unterstützt auch mehrere Spalten und Textumbrüche in der Combobox, aber das macht die Sache nur unnötig kompliziert.

     Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
        MyBase.OnDrawItem(e)

        //Don't draw the custom area if in DesignMode.
        If Me.DesignMode Then Return

        //Don't draw the custom area if the index is -1.
        If e.Index = -1 Then Return

        e.DrawBackground()

        Dim boundsRect As Rectangle = e.Bounds
        //Shift everything just a bit to the right.
        Dim lastRight As Integer = 2

        Dim brushForeColor As Color
        Dim bckColor As Color
        Dim lineColor As Color

        If Not (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
           //Item is not selected, use _BackColorOdd and _BackColorEven.
           If e.Index Mod 2 = 0 Then
              bckColor = _BackColorEven
           Else
              bckColor = _BackColorOdd
           End If
           //Use black text color.
           brushForeColor = Color.Black
           //Use dark line color.
           lineColor = _BackColorSelected
        Else
           //Item is selected, use the 'Selected' background color.
           bckColor = _BackColorSelected
           //Item is selected, use white font color.
           brushForeColor = Color.White
           //Use white line color.
           lineColor = Color.White
        End If

        //Draw the background rectangle with the appropriate color.
        Using brushBackColor As New SolidBrush(bckColor)
           e.Graphics.FillRectangle(brushBackColor, e.Bounds)
        End Using

        Using linePen As New Pen(lineColor)
           Using brsh As New SolidBrush(brushForeColor)

              //This is the multi-column stuff.
              For colIndex As Integer = 0 To _ColumnNames.Count - 1
                 //Variant(Object) type used to support different data types in each column.
                 Dim itm As Object
                 itm = FilterItemOnProperty(Items(e.Index), _ColumnNames(colIndex))

                 boundsRect.X = lastRight
                 boundsRect.Width = _ColumnWidths(colIndex)
                 lastRight = boundsRect.Right

                    e.Graphics.DrawString(itm, Me.Font, brsh, boundsRect)

                 //Draw a divider line.
                 If colIndex < _ColumnNames.Count - 1 Then
                    e.Graphics.DrawLine(linePen, boundsRect.Right, boundsRect.Top, _
                                        boundsRect.Right, boundsRect.Bottom)
                 End If
              Next
           End Using
        End Using

     End Sub

Das ist vielleicht ein bisschen zu viel für das, was Sie wollen, aber es wird den Zweck erfüllen.

1voto

Matt Breckon Punkte 3294

Wenn Sie keine Bearbeitungsmöglichkeiten benötigen, können Sie dafür entweder ein ListView-Steuerelement (im Modus Details) oder ein TreeControl verwenden. Die Bearbeitung mit diesen Steuerelementen wäre auf jeweils eine Zeile beschränkt (wie eine Umbenennungsfunktion im Windows Explorer).

Wenn Sie Bearbeitungsmöglichkeiten benötigen, benötigen Sie ein RichTextBox-basiertes Steuerelement, wie ChrisF vorschlägt.

1voto

ChrisF Punkte 130622

Es klingt, als bräuchten Sie ein Rich Text Editor-Steuerelement.

Es gibt zahlreiche Kontrollen von Drittanbietern - darunter auch eine auf CodeProjekt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X