首页 > 其他分享 >DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?

时间:2024-09-04 10:47:22浏览次数:12  
标签:sender 自定义 DevExpress 单元格 WinForms 绘制 view

在本教程中,您将学习如何使用DevExpress grid View(网格视图)的CustomDraw…事件,您将从一个显示普通任务数据的网格开始。首先使用事件来自定义单元格外观,然后修改相同的事件处理程序,来根据网格数据更改单个单元格中显示的文本。接下来将进一步扩展处理程序来在特定单元格中绘制图像,最后将看到如何自定义绘制列标题,同时保留其交互元素,如过滤器下拉按钮和排序符号。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?

P.S:DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

获取DevExpress WinForms v24.1正式版下载

DevExpress技术交流群10:532598169      欢迎一起进群讨论

开始

从一个应用程序开始,它有一个显示任务数据的GridControl。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
自定义绘制单个单元格

选择grid View(网格视图)并处理GridView.CustomDrawCell事件,这个事件提供了RowCellCustomDrawEventArgs.RowHandleRowCellCustomDrawEventArgs.Column参数,用于标识正在绘制的单元格列参数。

  • 自定义单元格外观
    如果单元格位于聚焦行中,则不会应用自定义绘制来确保聚焦样式的优先级。在第一个版本的事件处理程序中,更改UnitPrice列中值大于30的单元格背景样式。默认的绘制机制将在事件处理程序执行后调用,它将自动应用指定的背景。

C#

private void gridView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) {
GridView view = sender as GridView;
if (e.RowHandle == view.FocusedRowHandle) return;
if (e.Column.FieldName != "UnitPrice") return;
// Fill a cell's background if its value is greater than 30.
if (Convert.ToInt32(e.CellValue) > 30)
e.Appearance.BackColor = Color.FromArgb(60, Color.Salmon);
}

运行应用程序来查看结果,如您所见,符合指定条件的单元格具有不同的外观,并且通过这种方式,CustomDraw…事件允许您实现任何复杂性的条件格式。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
  • 更改单元格显示文本
    关闭应用程序并进一步修改自定义绘制事件处理程序,如果单元格位于已分配折扣的行中,则更改事件的RowCellCustomDrawEventArgs.DisplayText参数,指定的文本也将由默认呈现机制绘制。

C#

private void gridView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) {
// ...
// Specify the cell's display text.
double discount = Convert.ToDouble(view.GetRowCellValue(e.RowHandle, view.Columns["Discount"]));
if (discount > 0) {
double unitPrice = Convert.ToDouble(view.GetRowCellValue(e.RowHandle, view.Columns["UnitPrice"]));
double discountPrice = unitPrice * (1 - discount);
e.DisplayText = "Discount price: " + discountPrice.ToString("c2");
}
}

再次运行应用程序。注意,某些列单元格显示的是折扣价而不是单价。从本质上讲,这允许您执行使用未绑定列表达式和显示文本格式可以执行的操作,但是使用CustomDraw…事件,您可以将这些更改应用于单个单元格,而不是整个列。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
  • 在单元格中显示自定义图像
    在包含折扣价格的单元格的默认呈现上绘制自定义图像,使用e.Cache.DrawImage方法绘制自定义图像。要在此之前调用默认呈现机制,请调用CustomDrawEventArgs.DefaultDraw方法,此方法可防止在事件执行后重新调用默认绘制。

C#

private void gridView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) {
// ...
e.DefaultDraw();
// Paint images in cells if discounts > 0.
Image image = Image.FromFile("c:\\important.png");
if (discount > 0)
e.Cache.DrawImage(image, e.Bounds.Location);
}

运行应用程序,为某些单元格显示自定义图像。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
自定义绘制列标题

要自定义绘制列标题,请订阅GridView.CustomDrawColumnHeader事件,使用从“橙红色”到“白色”的渐变来填充列标题的背景,然后显示标题说明。将事件的CustomDrawEventArgs.Handled参数设置为true,以防止在事件处理程序完成时调用默认的绘图机制。

C#

private void gridView_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) {
Rectangle rect = e.Bounds;
// Create a new brush
using (Brush brush = new LinearGradientBrush(e.Bounds, Color.Salmon, Color.White, LinearGradientMode.ForwardDiagonal)) {
// Fill a column's background
e.Cache.FillRectangle(brush, rect);
// Draw the column's caption
e.Appearance.DrawString(e.Cache, e.Info.Caption, e.Info.CaptionRect);
e.Handled = true;
}
}

现在运行应用程序,将列标题用“橙红色”到“白色”渐变绘制。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?

但是,不会显示通常的排序和筛选符号。有一种方法可以解决这个问题,并在列标题中显示标准的交互式元素。您需要枚举ColumnHeaderCustomDrawEventArgs.Info.InnerElements集合,并使用一个特殊设计的方法来绘制它们,如果它们的设置表明它们当前是可见的。

C#

private void gridView_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) {
// ...
// Draw the filter and sort buttons.
foreach (DevExpress.Utils.Drawing.DrawElementInfo info in e.Info.InnerElements) {
if (!info.Visible) continue;
DevExpress.Utils.Drawing.ObjectPainter.DrawObject(e.Cache, info.ElementPainter, info.ElementInfo);
}
}

再次运行应用程序来查看结果,现在标题具有自定义外观,同时保留了标准元素,因此最终用户仍然可以以通常的方式与列标题进行交互。

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?
完整代码

C#

private void gridView_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) {
GridView view = sender as GridView;
if (e.RowHandle == view.FocusedRowHandle) return;
if (e.Column.FieldName != "UnitPrice") return;
// Fill a cell's background if its value is greater than 30.
if (Convert.ToInt32(e.CellValue) > 30)
e.Appearance.BackColor = Color.FromArgb(60, Color.Salmon);
// Specify the cell's display text.
double discount = Convert.ToDouble(view.GetRowCellValue(e.RowHandle, view.Columns["Discount"]));
if (discount > 0) {
double unitPrice = Convert.ToDouble(view.GetRowCellValue(e.RowHandle, view.Columns["UnitPrice"]));
double discountPrice = unitPrice * (1 - discount);
e.DisplayText = "Discount price: " + discountPrice.ToString("c2");
}
e.DefaultDraw();
// Paint images in cells if discounts > 0.
Image image = Image.FromFile("c:\\important.png");
if (discount > 0)
e.Cache.DrawImage(image, e.Bounds.Location);
}

private void gridView_CustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) {
Rectangle rect = e.Bounds;
// Create a new brush
using (Brush brush = new LinearGradientBrush(e.Bounds, Color.Salmon, Color.White, LinearGradientMode.ForwardDiagonal)) {
// Fill a column's background
e.Cache.FillRectangle(brush, rect);
// Draw the column's caption
e.Appearance.DrawString(e.Cache, e.Info.Caption, e.Info.CaptionRect);
e.Handled = true;
}
// Draw the filter and sort buttons.
foreach (DevExpress.Utils.Drawing.DrawElementInfo info in e.Info.InnerElements) {
if (!info.Visible) continue;
DevExpress.Utils.Drawing.ObjectPainter.DrawObject(e.Cache, info.ElementPainter, info.ElementInfo);
}
}

标签:sender,自定义,DevExpress,单元格,WinForms,绘制,view
From: https://www.cnblogs.com/AABBbaby/p/18396015

相关文章

  • C#自定义控件—文本显示、文本设值
    C#用户控件之文本显示、设定组件如何绘制一个便捷的文本显示组件、文本设值组件(TextShow,TextSet)?绘制此控件的目的就是方便一键搞定标签显示(可自定义方法显示文本颜色等),方便自定义方法又省略了挨个拖拽的过程纯定义属性【文本设定】:字体、标签、值、单位;事件方法:Enter、Lea......
  • 【多线程】 - 实现方法以及自定义线程池
    概念进程进程是程序的基本执行实体线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。多个线程组成了多线程多线程应用场景软件中的耗时操作拷贝、迁移大文件加载大量的资源文件想让多个事情同时运行就需要多线程并发和并行并发在同一时刻......
  • 使用自定义注解校验回款金额是否大于订单金额
    `/**自定义注解类处理器复合注解比较a表中x字段值是否大于b表中y字段值@AuthorLiZhiMin@Date2024/8/3117:34*/@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceFieldCompareValidators{/**要查询......
  • ant design vue 上传文件自定义上传,并发上传文件、取消上传、重新上传
    antdesignvue上传文件组件<a-upload-draggerv-model:fileList="fileList":accept="accept":beforeUpload="beforeUploadFile"class="upload-btn":headers="headers"multiple@change="ha......
  • 自定义缓存组件 代替 Spring@Cache缓存注解
    自定义缓存组件代替Spring@Cache缓存注解  在实现上述功能之前先来点基础的,redis在SpringBoot项目中常规的用法,好对缓存和redis客户端的使用有一定了解。  1.添加依赖redis客户端依赖(连接redis服务端必备 )<!--客户端依赖二选一--><dependency><groupId>redi......
  • 通过自定义注解、反射和AOP在Spring Boot中动态修改请求参数
    在SpringBoot中,通过自定义注解、反射以及AOP(面向切面编程)来动态修改请求参数是一种高级且强大的技术组合,它允许开发者在不修改原始方法实现的情况下,对方法的执行过程进行干预和定制。这种技术通常用于日志记录、权限校验、参数校验、数据脱敏等场景。下面,我将详细阐述如何......
  • 如何修改PbootCMS默认面包屑导航样式及自定义设置方法(如何自定义 PbootCMS 的面包屑导
    在PbootCMS中,面包屑导航是一个非常重要的导航元素,用于帮助用户了解当前页面的位置和路径。系统默认的面包屑样式可能无法满足所有需求,因此需要进行一定的自定义操作。以下是详细的自定义方法:调用面包屑导航的基本方式html {pboot:position}自定义面包屑导航参数可以......
  • 解决vs2022 工具箱中不显示 Devexpress控件的问题
    无效果的尝试1、在工具箱点右键选择RepairToolBox...无效果2、在工具箱中点右键重置工具箱无效果3、在工具箱中右键选择项浏览选择对应的dll,报错提示“面向无法动态枚举工具箱项目的平台”无效果4、删除整个vs配置文件夹:%LocalAppData%\Microsoft\VisualStudio<ver......
  • multus实现自定义网卡名字
    安装环境cat<<EOF|kindcreatecluster--nametest--config-kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4networking:kubeProxyMode:iptablesdisableDefaultCNI:falseipFamily:ipv4apiServerAddress:127.0.0.1apiServerPort:0podSubn......
  • C#自定义控件—流动管道
    C#用户控件之流动管道如何绘制一个动态的流动管道(FlowPipe)?分两步绘制定义属性;画布重绘;主要技能:管道的绘制(渐变色矩形)///<summary>///画渐变色矩形的方法///</summary>///<paramname="g">画布</param>///<paramname="brush">画刷</param>......