DevExpress WinForms中文教程:Data Grid - 如何自定义行预览部分?

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

在本教程中,您将学习如何使用DevExpress Grid View(网格视图)事件自定义行预览部分的内容和大小。首先您将自定义文本来包含来自多个数据字段的值,然后根据各个部分的内容指定预览部分的高度,最后使用CustomDraw事件将图像添加到预览中。

获取DevExpress WinForms v25.2正式版下载

开始

从启用了行预览部分的网格控件开始,您可以在其中显示Description字段中的值。

显示来自多个数据字段的值

首先,您将看到如何使用另外两个字段(MPG City和MPG Highway)的值扩展这些预览部分。

在设计时,访问网格视图的设置并为GridView.CalcPreviewText事件编写处理程序。声明一个单独的CalculateMyPreviewText方法,该方法使用CalcPreviewTextEventArgs.RowHandle参数获取数据行,然后获取三个字段的值:MPG City, MPG Highway和Description。如果描述为空,则该方法只返回一个空字符串。否则,它将返回一个组合了所有三个字段值的字符串。

在事件处理程序中调用此方法来指定CalcPreviewTextEventArgs.PreviewText参数值,从而自定义要显示的文本。

C#

cs 复制代码
private void gridView1_CalcPreviewText(object sender, DevExpress.XtraGrid.Views.Grid.CalcPreviewTextEventArgs e) {
e.PreviewText = CalculateMyPreviewText(e.RowHandle);
}

private string CalculateMyPreviewText(int rowHandle) {
DataRow row = gridView1.GetDataRow(rowHandle);
string mpgcity = row["MPG City"].ToString();
string mpghwy = row["MPG Highway"].ToString();
string description = row["Description"].ToString();
if (string.IsNullOrEmpty(description))
return string.Empty;
return string.Format("MPG City: {0}, MPG Highway: {1}\n{2}", mpgcity, mpghwy, description);
}

当您运行应用程序时,将看到只显示第一个字符串,因为网格不会自动计算自定义文本的预览高度。

GridView.PreviewLineCount属性设置为5,可以看到Description字段的值也会显示出来。

指定单个预览部分的高度

所有预览部分为5行文本预留空间,即使它不是必需的。预览文本为空,仍会显示空白区域。

要解决这个问题,关闭应用程序并为Grid View(网格视图)的GridView.MeasurePreviewHeight事件编写处理程序。如果Description字段值为空字符串,则代码将高度设置为0,否则使用尚未定义的GetRowImage函数将高度设置为该行中图像的高度。

然后定义这个函数,以便它从指定行的Image字段中获取Bitmap。

C#

cs 复制代码
using DevExpress.XtraGrid.Views.Grid;
// ...
private void gridView1_MeasurePreviewHeight(object sender, DevExpress.XtraGrid.Views.Grid.RowHeightEventArgs e) {
GridView view = sender as GridView;
if (view == null) return;
DataRow row = view.GetDataRow(e.RowHandle);
if (row["Description"].ToString() == String.Empty)
e.RowHeight = 0;
else
e.RowHeight = GetRowImage(e.RowHandle).Height;
}

private Bitmap GetRowImage(int rowHandle) {
DataRow row = gridView1.GetDataRow(rowHandle);
if (row["Image"] == System.DBNull.Value)
return null;
byte[] imageData = (byte[])row["Image"];
return new Bitmap(new System.IO.MemoryStream(imageData));
}

运行应用程序。您将看到默认情况下,包含文本的所有预览部分都显示不止一行,具有空Description字段值的行不显示预览。

向预览部分添加图像

现在添加图像,返回到设计时并处理GridView.CustomDrawRowPreview事件。用于计算预览高度的GetImage方法显然在这里也很有用,使用CustomDrawEventArgs.Cache参数绘制获得的图像。

然后计算要绘制文本的矩形,考虑到图像宽度和额外的20像素偏移,初始化左上角,矩形的宽度也被调整为适合图像。

下一步是获取文本,这是使用本教程开始时声明的CalculateMyPreviewText方法完成的,并在GridView.CalcPreviewText事件中使用。最后指定修剪样式并绘制文本,设置CustomDrawEventArgs.Handled为true来禁用默认绘画。

C#

cs 复制代码
private void gridView1_CustomDrawRowPreview(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e) {
Bitmap image = GetRowImage(e.RowHandle);
e.Cache.DrawImage(image, e.Bounds.X, e.Bounds.Y, image.Width, image.Height);

Point textOrigin = new Point(e.Bounds.X + image.Width + 20, e.Bounds.Y + 4);
Rectangle textRect = new Rectangle(textOrigin.X, textOrigin.Y, e.Bounds.Width - textOrigin.X, e.Bounds.Height - 8);
string text = CalculateMyPreviewText(e.RowHandle);
StringFormat format = e.Appearance.GetStringFormat();
format.Trimming = StringTrimming.EllipsisWord;
e.Cache.DrawString(text, e.Appearance.Font, e.Appearance.GetForeBrush(e.Cache), textRect, format);

e.Handled = true;
}

运行应用程序来查看结果,现在可以隐藏显示与行预览部分中显示的信息相同的列。

相关推荐
Aevget1 天前
Kendo UI for jQuery 2025 Q4新版亮点 - AI 助手持续加持,主力开发更智能
人工智能·ui·jquery·界面控件·kendo ui
Aevget6 天前
界面控件DevExpress v25.2新版亮点 - 进一步升级AI扩展功能
人工智能·界面控件·devexpress·ui开发·.net 10
Crazy Struggle8 天前
C# 不依赖 OpenCV 的图像处理算法:滤波、锐化与边缘检测
.net·开源项目·winform
泉飒8 天前
WinForm与WPF的异同点
wpf·winform
Aevget9 天前
MFC扩展库BCGControlBar Pro v37.1亮点:Ribbon Bar组件全新升级
c++·ribbon·mfc·bcg·界面控件·ui开发
c#上位机10 天前
Winform开发中Label控件居中显示
c#·winform
刘欣的博客14 天前
第一次使用antdui(AntdUI说明一)
winform·antdui
雪雁14 天前
CodeSpirit 多语言国际化使用指南(Beta)
c#·asp.net·.net 10·codespirit
Aevget14 天前
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(三)?
wpf·界面控件·devexpress·ui开发·.net 10