对于Winforms应用程序,我正在寻找能够显示文本并支持单行颜色(每行的前景色和背景色)的控件。
例如,我希望第1行的背景为绿色,第4行的颜色为红色。
答案 0 :(得分:7)
ListView控件可能是您需要的最简单的控件(只要它只是用于显示)。将其View属性设置为List
。每个项目都是ListViewItem,您可以在其上设置foreground和background颜色。
答案 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
上的一个