Winforms控件显示文本和支持单独的行着色

时间:2009-12-07 22:44:11

标签: c# winforms controls formatting

对于Winforms应用程序,我正在寻找能够显示文本并支持单行颜色(每行的前景色和背景色)的控件。

例如,我希望第1行的背景为绿色,第4行的颜色为红色。

4 个答案:

答案 0 :(得分:7)

ListView控件可能是您需要的最简单的控件(只要它只是用于显示)。将其View属性设置为List。每个项目都是ListViewItem,您可以在其上设置foregroundbackground颜色。

答案 1 :(得分:2)

过去,我使用定制的组合框进行此类控制。我在构造函数中将DrawMode设置为OwnerDrawVariable,并覆盖OnDrawItem方法。这样,您可以使用您想要的任何颜色或样式为组合框中的每个项目绘制背景。

下面的代码绘制了灰色背景的所有其他项目,如this post中显示的图像,但您可以在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

对于你想要的东西,这可能有点过分,但它会起到作用。

答案 2 :(得分:1)

如果您不需要编辑工具,可以使用ListView控件(在详细信息模式下)或TreeControl。使用这些控件进行编辑将限制为一次一行(如Windows资源管理器中的重命名工具)。

如果你确实需要编辑工具,那么你需要一个基于RichTextBox的控件,正如ChrisF建议的那样。

答案 3 :(得分:1)

听起来您可能需要富文本编辑器控件。

有很多第三方控件 - 包括CodeProject

上的一个