Элемент управления Winforms отображает текст и поддерживает отдельные цвета линий - PullRequest
4 голосов
/ 08 декабря 2009

Для приложения Winforms я ищу элемент управления, который может отображать текст и поддерживает отдельные цвета линий (передний и фоновый цвета на строку).

Например, я бы хотел, чтобы строка 1 была зеленого цвета, а строка 4 - красным.

Ответы [ 4 ]

7 голосов
/ 08 декабря 2009
Элемент управления

A ListView , вероятно, является самым простым для того, что вам нужно (при условии, что оно только для отображения). Установите для свойства View значение List. Каждый элемент представляет собой ListViewItem , для которого можно установить цвета foreground и background .

2 голосов
/ 08 декабря 2009

В прошлом я использовал настраиваемый комбинированный список для этого типа управления. Я установил DrawMode в OwnerDrawVariable в конструкторе и переопределил метод OnDrawItem. Таким образом, вы можете нарисовать фон для каждого элемента в выпадающем списке любым цветом или стилем, который вы хотите.

Приведенный ниже код рисует каждый второй элемент на сером фоне, как изображения, показанные в в этом сообщении , но вы можете настроить его так, как вам удобно, в методе OnDrawItem. этот пример также поддерживает несколько столбцов и перенос текста в выпадающем списке, но это только излишне усложняет ситуацию.

     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

Это может быть немного излишним для того, что вы хотите, но это поможет.

1 голос
/ 08 декабря 2009

Похоже, вам может понадобиться элемент управления Rich Text Editor.

Существует множество сторонних элементов управления, включая один на CodeProject

1 голос
/ 08 декабря 2009

Если вам не нужны средства редактирования, вы можете использовать для этого элемент управления ListView (в режиме «Сведения») или TreeControl. Редактирование с помощью этих элементов управления будет ограничено одной строкой за раз (например, средство переименования в проводнике Windows).

Если вам нужны средства редактирования, тогда вам понадобится элемент управления на основе RichTextBox, как предлагает ChrisF.

...