自定义绘制事件提供了对网格控件元素的外观的完整控制。 本文档给出了关于使用自定义绘制事件的一些公共示例。 要获得关于在 XtraGrid 中自定义绘制的总说明,请参阅 自定义绘制基础 章节。
本主题提供了使用自定义绘制事件的三种主要场景的示例:
-
全面绘制
使用 Graphics 对象的绘制方法,可以完成元素的全面绘制。
-
调用默认的绘制机制
可以为元素调用默认的绘制机制,然后改变绘制设置,只使用新设置绘制元素的某些部分,而为元素的其余部分保留默认设置。 当接管的自定义绘制事件提供了 Info 和 Painter 参数时,可以使用这种方法。 可以通过事件的 Info 参数,改变默认绘制机制的显示信息 (显示文本,内部元素边界和样式)。
-
改变显示信息
在这种情况下,不需要自行呈现整个元素,而是可以简单地改变用于绘制它的信息 (外观、内容、边界)。 然后在执行事件处理程序之后,元素被绘制。 这种方法不适用于所有自定义绘制事件。 例如,不能使用 GridView.CustomDrawCell 事件来代替默认的外观。 但是,此事件允许为单元格提供自定义显示文本。 要改变用于绘制个别单元格的外观设置,则需要接管 GridView.RowCellStyle 事件。 请参阅 定制个别行与单元格的外观 主题获知其他信息。
进行全面的元素绘制
下面的示例演示了如何使用 GridView.CustomDrawCell 事件来自定义绘制 RequiredDate 列的单元格。 如果单元格引用了当前日期或以后的日期,则使用渐变刷填充背景。 如果单元格包含了大于当前日期的日期,则单元格将显示余下的天数,直至所指定的日期。 其他单元格的外观不受影响。
下面的插图展示了运行结果。
C# | 复制代码 |
---|---|
using System.Drawing.Drawing2D; ColorBlend colorBlend = null; private void frmMain_Load(object sender, System.EventArgs e) { colorBlend = new ColorBlend(); colorBlend.Colors = new Color[] {Color.Orchid, Color.White, Color.Orchid}; colorBlend.Positions = new float[] {0.0f, 0.5f, 1.0f}; } private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if(e.Column.FieldName != "RequiredDate") return; //Get the cell's value DateTime reqDate = (DateTime)e.CellValue; if(reqDate < DateTime.Today) return; //Calculate the text to display in the cell string dispText; if(reqDate > DateTime.Today) dispText = ((TimeSpan)(reqDate - DateTime.Today)).Days.ToString() + " day(s) left"; else dispText = e.DisplayText; //Create the gradient brush LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, Color.White, Color.Black, LinearGradientMode.ForwardDiagonal); //Provide custom color blending brush.InterpolationColors = colorBlend; //Fill the cell's background using(brush) { e.Graphics.FillRectangle(brush, e.Bounds); } //Draw the cell's text e.Graphics.DrawString(dispText, e.Appearance.Font, Brushes.Black, e.Bounds); //Prohibit the default painting e.Handled = true; } |
Visual Basic | 复制代码 |
---|---|
Imports System.Drawing.Drawing2D Private colorBlend As colorBlend = Nothing Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load colorBlend = New ColorBlend colorBlend.Colors = New Color() {Color.Orchid, Color.White, Color.Orchid} colorBlend.Positions = New Single() {0.0F, 0.5F, 1.0F} End Sub Private Sub GridView1_CustomDrawCell(ByVal sender As Object, _ ByVal e As DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs) _ Handles GridView1.CustomDrawCell If e.Column.FieldName <> "RequiredDate" Then Return 'Get the cell's value Dim reqDate As DateTime = e.CellValue If (reqDate < DateTime.Today) Then Return 'Calculate the text to display in the cell Dim dispText As String If (reqDate > DateTime.Today) Then dispText = reqDate.Subtract(DateTime.Today).Days.ToString() + " day(s) left" Else dispText = e.DisplayText End If 'Create the gradient brush Dim brush As LinearGradientBrush = New LinearGradientBrush(e.Bounds, Color.White, _ Color.Black, LinearGradientMode.ForwardDiagonal) 'Provide custom color blending brush.InterpolationColors = colorBlend 'Fill the cell's background e.Graphics.FillRectangle(brush, e.Bounds) brush.Dispose() 'Draw the cell's text e.Graphics.DrawString(dispText, e.Appearance.Font, Brushes.Black, _ New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)) 'Prohibit the default painting e.Handled = True End Sub |
使用默认的绘制机制
这些元素的自定义绘制事件提供了 Painter 和 Info 参数。 要调用默认的绘制程序,则调用事件的 Painter 参数的 DrawObject 方法。 此方法需要一个特定的提供绘制元素 (外观设置、显示文本、边界等) 所需信息的参数。 在某些情况下,需要把事件的 Info 参数传递到时该方法。 在调用 DrawObject 方法之前,可以修改 Info 对象的属性 (例如,可以提供自定义显示文本,改变内部元素的边界,或指定自定义外观设置)。 根据所提供的信息,元素被呈现。 在默认的呈现之后,可以绘制附加信息。 注意,必须把 CustomDrawEventArgs.Handled 属性设置为 true 来禁止自定义绘制被重写。
要为默认的绘制机制指定自定义外观设置,则使用 CustomDrawEventArgs.Appearance 属性。
注意,修改元素或内部元素的边界,会改变视图的布局。 如果为了执行自定义绘制而需要改变元素的边界,则在调用 Painter.DrawObject 方法之后应该立即恢复边界。
在下面的示例中,接管了 GridView.CustomDrawColumnHeader 事件来自定义绘制列标头。 所有列标头的标题都以阴影效果被绘制。 已应用筛选的列的标题被绘制为蓝色。 排序列标头的背景被绘制为 Color.LemonChiffon 色 (其他列标头的背景色为 Color.Tan)。
在 GridView.CustomDrawColumnHeader 事件处理程序中,调用默认的绘制机制来绘制没有标题的列标头 (为了达到此目的, e.Info.Caption 属性值被设置为一个空字符串)。 排序列标头以自定义外观设置进行绘制。
在需要时,Painter.DrawObject 方法绘制列标头的背景、筛选按钮、排序符号 和 标头图像 。 列的标题被绘制文本。 为了确保在事件处理程序执行完毕之后绘制不被覆盖,CustomDrawEventArgs.Handled 参数被设置为 true。
下面的插图展示了自定义绘制的网格视图:
C# | 复制代码 |
---|---|
using DevExpress.Utils; // ... private void gridView1_CustomDrawColumnHeader(object sender, DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs e) { if(e.Column != null) { // Don't display the column's caption when using the default painting mechanism. e.Info.Caption = ""; // Changing the background color for sorted columns. if(e.Column.SortOrder != DevExpress.Data.ColumnSortOrder.None) e.Appearance.BackColor = Color.LemonChiffon; // Draws the column header based on the information specified. e.Painter.DrawObject(e.Info); // Draws the column's caption with a shadowed effect. // Filtered column captions are drawn in blue. Rectangle r = e.Info.CaptionRect; StringFormat sf = new StringFormat(); sf.Trimming = StringTrimming.EllipsisCharacter; e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Beige, new Rectangle(r.X + 1, r.Y + 1, r.Width, r.Height), sf); if(e.Column.FilterInfo.Type == DevExpress.XtraGrid.Columns.ColumnFilterType.None) e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Black, r, sf); else e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Blue, r, sf); // Prevent the custom painting from being overridden. e.Handled = true; } } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.Utils '... Private Sub GridView1_CustomDrawColumnHeader(ByVal sender As Object, _ ByVal e As DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs) _ Handles GridView1.CustomDrawColumnHeader If Not e.Column Is Nothing Then ' Don't display the column's caption when using the default painting mechanism. e.Info.Caption = "" ' Changing the background color for sorted columns. If Not e.Column.SortOrder = DevExpress.Data.ColumnSortOrder.None Then e.Appearance.BackColor = Color.LemonChiffon End If ' Draws the column header based on the information specified. e.Painter.DrawObject(e.Info) ' Draws the column's caption with a shadowed effect. ' Filtered column captions are drawn in blue. Dim r As Rectangle = e.Info.CaptionRect Dim sf As StringFormat = New StringFormat() sf.Trimming = StringTrimming.EllipsisCharacter e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Beige, _ New RectangleF(r.X + 1, r.Y + 1, r.Width, r.Height), sf) If e.Column.FilterInfo.Type = DevExpress.XtraGrid.Columns.ColumnFilterType.None Then e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Black, _ New RectangleF(r.X, r.Y, r.Width, r.Height), sf) Else e.Graphics.DrawString(e.Column.Caption, e.Appearance.Font, Brushes.Blue, _ New RectangleF(r.X, r.Y, r.Width, r.Height), sf) End If ' Prevent the custom painting from being overridden. e.Handled = True End If End Sub |
定制元素的显示信息
并非所有自定义绘制事件都允许修改所有的显示信息 (显示文本、内部元素边界和外观)。 下表描述了可以用于定制显示信息的自定义绘制事件。
自定义绘制事件 | 允许… |
---|---|
GridView.CustomDrawColumnHeader ColumnView.CustomDrawFilterPanel GridView.CustomDrawRowFooterCell |
—— 通过事件的 Info 参数修改显示信息。
Info 对象允许改变显示文本 (如果正被绘制的元素有任何可用的显示文本) 和用于绘制元素的外观设置。 避免由于改变内部元素边界而导致改变视图的布局。 如果需要修改元素的边界,然后调用默认的绘制机制,则应该使用在 使用默认的绘制机制 小节中介绍的方法。 在这种情况下,通过调用 Painter 参数的 DrawObject 方法来改变元素的边界和调用默认的绘制程序,然后恢复被修改元素的边界。 |
CardView.CustomDrawCardFieldValue CardView.CustomDrawCardCaption |
—— 通过 DisplayText/CardCaption 参数动态提供自定义显示文本。
—— 使用事件参数的 Appearance 属性提供一个自定义外观。 |
要指定自定义外观,则使用事件的 CustomDrawEventArgs.Appearance 参数。 此属性返回 AppearanceObject 对象,此对象提供了用于绘制元素的外观设置。
下面的示例演示了如何为在 视图脚注 内显示的 脚注单元格 指定自定义外观。 在默认情况下,用于绘制视图脚注单元格的外观设置是由 GridViewAppearances.FooterPanel 属性指定的。 在本示例中,根据它们呈现的汇总类型,脚注单元格被绘制。
下面的插图展示了运行结果。
C# | 复制代码 |
---|---|
private void gridView1_CustomDrawFooterCell(object sender, DevExpress.XtraGrid.Views.Grid.FooterCellCustomDrawEventArgs e) { if(e.Column.SummaryItem.SummaryType == DevExpress.Data.SummaryItemType.Count) e.Appearance.BackColor = Color.AntiqueWhite; else { if(e.Column.SummaryItem.SummaryType == DevExpress.Data.SummaryItemType.Average) e.Appearance.BackColor = Color.PaleGoldenrod; else e.Appearance.BackColor = Color.DarkSeaGreen; } } |
Visual Basic | 复制代码 |
---|---|
Private Sub GridView1_CustomDrawFooterCell(ByVal sender As Object, _ ByVal e As DevExpress.XtraGrid.Views.Grid.FooterCellCustomDrawEventArgs) _ Handles GridView1.CustomDrawFooterCell If (e.Column.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Count) Then e.Appearance.BackColor = Color.AntiqueWhite Else If (e.Column.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Average) Then e.Appearance.BackColor = Color.PaleGoldenrod Else e.Appearance.BackColor = Color.DarkSeaGreen End If End If End Sub |