Delphi、C++ Builder 和 .NET sgcUI 成员

sgcGrid,适用于 Delphi、C++ Builder 和 .NET 的实时数据网格

专为瞬息万变的数据打造的网格。可从任意线程按键写入行,变化的单元格会闪烁绿色或红色,同一批行还能分组、筛选、编辑和导出。在 Win32 上,100,000 行网格渲染一帧 1080p 画面仅需 3.0 毫秒。

VCL、FireMonkey、WinForms、WPF、Avalonia每帧 1080p 仅 3.0 毫秒(Win32)免费的 .NET 社区版包含在 sgcUI Standard 中
sgcGrid 显示 100,000 张订单,按地区再按类别分组,带分组面板标签和页脚合计

实时网格所需的一切

十八项功能分为五组,每项都链接到对应的帮助主题。

实时数据

永不停歇的数据流:价格、遥测、队列和日志。

实时数据

从任意线程每秒更新数千行

行情源、传感器总线或作业队列都可以直接写入网格。每一行都有一个键,工作线程按字段名更新某个键对应的行,无需调用 Synchronize,也不需要自己编写加锁代码。网格只在写入线程上标记自身为脏,并在主线程上以每秒最多 MaxFPS 次的频率重绘。

  • UpdateRow 设置某个键的指定字段,键为新键时插入该行;UpdateCell 修改单个字段
  • AppendRow 和 DeleteRow 按键添加和删除行,可在任意线程调用
  • BeginUpdate 和 EndUpdate 把一批操作合并为一次通知
  • 每次重新排序后,选中的行都会按其键重新找到,不会跳走
阅读帮助主题
一眼看清每一处变化

实时数据

一眼看清每一处变化

交易员和操作员需要在不逐个读数字的情况下看到哪些数据发生了变化。FlashChanges 开启时(默认开启),数值上升的单元格会染成绿色,下降的染成红色,然后在 FlashDuration 毫秒(默认 800)内逐渐消退。对于日志和不断增长的数据流,尾随模式会让最新一行保持在视野内,并在用户向上滚动阅读时立即停止跟随。

  • FlashUpColor、FlashDownColor 和 FlashChangedColor;颜色为 0 时使用主题默认值
  • FlashMode 为背景染色(fmBackground)或为文本染色(fmText)
  • TailMode 跟随最新一行,MaxRows 丢弃无尽日志中最旧的行
  • 选中状态绘制在闪烁之上,闪烁绘制在格式规则之上
阅读帮助主题
为需要关注的行着色

实时数据

为需要关注的行着色

逾期发票、负余额或失败的作业应该在有人问起之前就显眼可见。格式规则按列的数据类型把该列与某个值比较:数字按数值,日期按日期,文本不区分大小写。匹配的规则可为单元格或整行设置背景色、文字颜色或粗体,并且在实时更新改变底层数值时仍然生效。

  • TsgcGridFormatRules 按集合顺序计算其规则,后面的匹配会覆盖前面的
  • 提供 gfoLess、gfoBetween、gfoContains 和 gfoIsEmpty 等运算符
  • ApplyToRow 为整行的每个单元格设置样式,StopOnMatch 为某个单元格结束规则计算
  • 半透明颜色会叠加在单元格背景上,OnGetCellStyle 拥有最终决定权
阅读帮助主题

整理数据

对大型行集进行排序、筛选、分组和嵌套。

一次调用即可对 100,000 行分组并汇总

整理数据

一次调用即可对 100,000 行分组并汇总

按地区的销售额、按月的订单、按状态的工单:用户想要的是合计,而不是原始行。GroupBy 按一列或多列对网格分组,每个分组行显示其成员、行数以及各行的汇总。用户可以把列标题拖到分组面板上自行重新分组。分组只是视图状态,因此绑定到网格的图表看到的仍是平铺且已排序的行。

  • 从代码调用 GroupBy 和 ClearGrouping,或为每列设置 GroupIndex
  • ShowGroupPanel 添加可拖放的标签;点击标签可翻转分组顺序
  • SummaryType 可取 gsuSum、gsuCount、gsuAverage、gsuMin 或 gsuMax,并用 SummaryFormat 格式化
  • 每个分组行显示 GroupSummaries,ShowFooter 显示总计
  • DisplayFormat 设为 yyyy-mm 时,日期按月分组
阅读帮助主题
在大数据中排序、筛选和查找

整理数据

在大数据中排序、筛选和查找

在数千条记录中找到一位客户,应该只需敲几下键盘。FilterText 保留在任意可见列中格式化文本包含所输入词语的行,OnFilterRow 处理程序可在此基础上加入您自己的规则。点击列标题即可排序,按住 Ctrl 点击可把某列加入多列排序,并且排序是稳定的。一个持续变化但既未排序也未筛选的列完全不会触发重新排序。

  • 每列有 SortOrder 和 SortIndex,每次更改后触发 OnSortChange
  • FilterText 不区分大小写,并按用户看到的文本读取
  • OnFilterRow 用于自定义逻辑,该逻辑变化时调用 InvalidateView
  • SelectionMode 选择行或单元格,Ctrl+C 将其复制为以制表符分隔的文本
  • 空值、空白值和无法转换的值始终排在最前
阅读帮助主题
用树形行和明细带展示层级结构

整理数据 仅限注册版

用树形行和明细带展示层级结构

组织结构图或物料清单最适合用树形展示,客户的订单最好直接显示在客户下方。树形行根据键列和父列按深度优先排布。明细带在任意主行下方展开一个由相关行组成的小网格,拥有自己的标题、滚动和排序,数据来自 TsgcGridDataStore、另一个网格或某个事件。

  • Tree.KeyField 和 Tree.ParentField 开启树形;ExpandNode 和 CollapseNode 可从代码调用
  • 展开状态按键保存,因此在排序、筛选和实时更新后依然保留
  • Detail.MasterKeyField 和 Detail.DetailKeyField 把明细带与其数据源关联,OnGetDetailData 按需填充
  • 明细带适用于平铺、分组和树形模式,变化的明细单元格会像主网格一样闪烁

.NET 社区版不含此功能,但保留分组。

阅读帮助主题
滚动其余列时保持关键列可见

整理数据

滚动其余列时保持关键列可见

当股票代码或客户名称滚出视野时,宽网格就会失去上下文。FrozenColumns 让前几个可见列固定不动,其余列水平滚动,标题、页脚和分组汇总遵循相同的拆分。用户可以拖动标题边缘调整列宽,无界面渲染器使用相同的设置,因此导出的图像与屏幕一致。左侧的分组折叠箭头同样不会滚动。

  • FrozenColumns 按可见列计数,一条一像素的线标出冻结边缘
  • 键盘移动会把已滚动的列带入冻结边缘右侧的视野
  • 渲染器的 FrozenWidth 返回不滚动部分的宽度
  • MinWidth 限制调整大小,OnColumnResized 报告新的宽度
  • 每个版本都包含,免费的 .NET 社区版也不例外
  • 支持阿拉伯语和希伯来语的从右到左:第一列位于右侧,冻结列保持在右边缘,从右到左网格的 XLSX 导出会写出从右到左的工作表
阅读帮助主题
FilterAndFind 演示:漏斗按钮、带有 (2 values) 和 > 500 的筛选行,以及高亮 Nakatomi 的查找面板

整理数据

像电子表格一样筛选,并找到任何值

用户期望看到 Excel 里那个熟悉的漏斗。ShowFilterButtons 会在每个列标题中放一个:它会打开一个弹出窗口,列出该列的不同值及其行数、一个搜索框,以及最多两个用 And 或 Or 连接的类型化条件。ShowFilterRow 会在标题下方添加一行,边输入边筛选一列,Ctrl+F 则打开查找面板,在每个单元格中高亮文本,并在各个匹配项之间跳转。

  • 每列只有一个筛选器,弹出窗口、筛选行和代码中的 Column.Filter 都会修改它,所以三者始终保持一致
  • 两个已筛选列的值列表会相互收窄,实心漏斗表示哪些列正在筛选
  • 每列的 FilterRowOperator:等于、大于、包含、开头为、为空等等
  • FindText、FindNext 和 FindPrevious 可在代码中使用,FindOnlyMatches 会隐藏没有匹配项的行
  • 列筛选器会与 FilterText 和 OnFilterRow 一起应用,OnFilterChange 会报告每次更改

适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。

阅读帮助主题

整理数据

让用户自行排列列,并记住他们的选择

右键单击列标题会打开一个菜单,可以排序、分组、调整宽度、筛选,并打开列选择器,这是一个每列带一个复选框的弹出窗口。用户可以拖动标题来移动该列,双击标题边缘则会让宽度适应标题和单元格。SaveLayoutToString 和 LoadLayoutFromString 会把这一切保存成一小段 JSON 文本,所以网格会按用户离开时的样子打开。

  • HeaderMenu、ColumnMoving 和 BestFitOnDblClick 默认开启,指定的 PopupMenu 优先
  • ShowColumnChooser 可以从你自己的按钮或菜单项打开选择器
  • 被移动的列仍位于冻结列的同一侧及其所在带区内,OnColumnMoved 会报告这次移动
  • BestFitColumn 和 BestFitColumns 会测量标题以及最多 1,000 个采样行,所以一百万行的开销与一千行差不多
  • 布局会保存列顺序、宽度、可见性、排序、分组、列筛选器、带区和面板选项;SaveLayoutToFile 和 LoadLayoutFromFile 使用文件

适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。

阅读帮助主题
BandsAndCells 演示:Instrument、Live data、Price 和 Position 带区、面积迷你图、进度条、状态图标和三个选中的行

整理数据

带区标题、丰富的单元格和多行选择

当 Last、Change 和 Trend 位于同一个 Price 标题之下时,交易界面更易阅读。Bands 会在列组上方添加标题,层级数量不限,每一列在 Band 中指明自己的带区。CellKind 会把单元格绘制成图像、进度条或迷你图,而单元格仍保留其原始值,所以排序、分组和导出看到的仍是数字。

  • Bands.Add 接受一个标题和一个父带区,带区行会堆叠在列标题上方
  • gcdProgress 使用 ProgressMin 和 ProgressMax;gcdSparkline 根据一组数字绘制折线图、面积图或柱状图
  • gcdImage 绘制 CellImages 中的图像,网格会用分配给 Images 的任意图像列表来填充它
  • SelectionMode 的 gsmMultiRow 可用 Ctrl 和 Shift 选择任意一组行,gsmCellRange 选择一个单元格区域,Ctrl+A 选择全部
  • 选择按行键保存,所以在排序、筛选和实时更新之后仍然保留,Ctrl+C 会把它复制为制表符分隔的文本

适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。

阅读帮助主题

编辑与导出

修改数据,与数据库同步,再交给他人。

编辑与导出 仅限注册版

带验证的就地编辑

后台办公用户希望直接在网格中修改数量或状态。把 ReadOnly 设为 False 后,按 F2、Enter、输入字符或双击即可在单元格上打开编辑器;如果该列有 PickList,则打开组合框。输入的文本会转换为该列的数据类型,OnValidate 可以修改或拒绝该值,结果通过 UpdateCell 写入,因此排序和闪烁依然适用。

  • 每列可设 Editable,OnBeforeEdit 可以拒绝编辑
  • Enter 提交,Tab 移到下一个可编辑单元格,Escape 取消;StartEdit、CommitEdit 和 CancelEdit 可从代码完成同样的操作
  • 输入有误时 OnEditError 保持编辑器打开,OnEdited 报告旧值和新值

.NET 社区版不含此功能。

阅读帮助主题
几行代码绑定任意 TDataSet

编辑与导出

几行代码绑定任意 TDataSet

现有的数据库代码照常工作:TsgcGridSource_DataSet 可从 FireDAC 查询、TClientDataSet 或任何其他 TDataSet 填充网格。设置其 Grid 和 DataSet,将其置为 Active,行就会出现。设置 KeyField 后,网格会同步而不是重新加载,因此变化的行就地更新并闪烁。开启 LiveUpdates 后,每一次已提交的 Append、Edit 和 Delete 都会无需额外代码地到达网格。

  • AutoColumns 根据数据集字段创建列
  • 设置 KeyField 后,新键会被追加,缺失的键会被删除
  • 遍历数据集时使用 DisableControls,并恢复其当前记录
  • JSON 和 CSV 同样支持:GridLoadFromJSONFile、GridSaveToCSVFile 以及 sgcGrid_IO 的其余函数
  • 在 .NET 中,同一个类读取 DataTable
阅读帮助主题

编辑与导出 仅限注册版

交给用户一份真正的 Excel 文件

财务部门要的是 Excel 中的数字,而不是截图。SaveToXLSX 无需外部库,即可把网格作为 Office Open XML 工作簿写入文件或流。工作表保留用户所见的内容:按显示顺序排列的可见列及其宽度和数字格式、冻结的标题、作为可折叠分级显示的分组和树形层级,以及作为 SUBTOTAL 公式的分组合计。

  • SaveToXLSX 接受文件名或流,以及可选的工作表名称
  • 数字保持为数字,日期变成 Excel 日期,DisplayFormat 成为单元格的数字格式
  • 已折叠的分组在 Excel 中同样以折叠状态打开,与网格中显示的一致
  • 请在界面线程调用;明细带不会导出
  • 每个分组行和视图行都会写入,无论是否已折叠

.NET 社区版不含此功能,但保留 JSON 和 CSV 导出。

阅读帮助主题
DataSetEditing 演示:TDBNavigator 和两个 TDBEdit 与网格共用同一批记录,另有一个类别查找列

编辑与导出 仅限注册版

通过网格编辑 DataSet

启用 WriteBack 后,TsgcGridSource_DataSet 会把网格中的每次修改写入该行的记录。它通过 KeyField 定位记录并提交值。如果提交失败,例如在 BeforePost 检查中失败,记录会被取消,单元格保留旧值。SyncCursor 让当前记录和活动行保持一致,所以同一个数据集上的 TDBNavigator 和 TDBEdit 控件会跟随网格,网格也会跟随它们。

  • AllowInsert:Ins 追加并提交一条记录,数据集的 OnNewRecord 会填入默认值
  • AllowDelete:在 OnBeforeDelete 同意之后,Ctrl+Del 会删除选中的行及其记录
  • 查找字段会作为查找结果的选择列表进行编辑,并写入对应的键
  • OnEditError 显示数据集的消息;粘贴的值和撤销使用同一条写入路径

适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格;.NET 社区版不含此功能。在 .NET 中,数据源写回 DataTable,AddLookup 添加查找列,SyncCursor 仅限 Delphi。

阅读帮助主题
Editing 演示的深色主题,Date 列中打开了一个日期选择器

编辑与导出 仅限注册版

日期选择器、从 Excel 粘贴、撤销和重做

每一列都选择用哪个控件来编辑它。EditorKind 可选择日期、时间或日期时间选择器、带箭头的数字框、颜色选择器,或来自 sgcEditors 的令牌编辑器,默认值由列的数据类型决定。Ctrl+V 会粘贴从 Excel 复制的数据块:每个值在写入任何内容之前都会先转换并验证,整个粘贴只算一个撤销步骤。Ctrl+Z 和 Ctrl+Y 会撤销和重做修改与粘贴。

  • OnCreateEditor 可以把你选择的任意控件放进单元格,例如 TTrackBar
  • PasteText 和 PasteFromClipboard 可在代码中使用,OnBeforePaste 可以修改或拒绝文本
  • 只要有一个值无法转换,或被 OnValidate 拒绝,粘贴就会在写入任何内容之前停止
  • 撤销按行键和字段工作,所以排序或筛选之后仍能找到对应的行,并且会保留期间被实时更新改变的值
  • UndoLimit 保留最近 100 步;Undo、Redo 和 CanUndo 可在代码中使用

适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格;.NET 社区版不含此功能。

阅读帮助主题

扩展与连接

百万行数据、实时数据流和自然语言。

浏览百万行数据而无需加载

扩展与连接

浏览百万行数据而无需加载

日志归档、传感器历史和已存在于别处的查询结果,不需要复制到内存中。在虚拟模式下,网格不存储任何行:VirtualRowCount 告知行数,当某一行滚动进入视野时,OnGetValue 返回其值。只绘制可见行,因此百万行网格的开销与五十行的网格相当。数据源增长时可随时更改行数。

  • 网格数据上的 Virtual 和 VirtualRowCount,由 OnGetValue 提供单元格内容
  • 页脚汇总同样通过 OnGetValue 读取其值
  • 虚拟行没有键,因此保持数据源的顺序,不支持排序、筛选和闪烁
  • 对于无限增长的数据流,MaxRows 配合 TailMode 是基于键的替代方案
阅读帮助主题

扩展与连接

让用户用自然语言向网格提问

并非每位用户都想自己构建筛选条件。TsgcGridAI 可把诸如 price greater than 100 sort by volume descending highlight change less than 0 这样的问题转换为网格上的筛选、排序和行高亮,AI 查询栏则为用户提供输入问题的位置。未指定提供程序时,基于规则的解析器在本地回答,无需网络和 API 密钥。指定提供程序后,则由任意大语言模型来回答:TsgcUIAIEventProvider 把每个请求交给你自己的代码,TsgcUIAIChatProvider 则使用 sgcWebSockets 的 TsgcAIChat 组件。只发送字段目录,即各列的名称、标题、类型和少量示例值,绝不发送行数据。网格无法应用的请求(例如分组或行数限制)会被如实报告,而不是猜测。

  • 查询栏:TsgcVCLAIQueryBar、TsgcFMXAIQueryBar、TsgcWinFormsAIQueryBar、TsgcWpfAIQueryBar 和 TsgcAvaloniaAIQueryBar,带有最近的问题、建议、取消和撤销
  • 筛选通过 OnFilterRow 处理,高亮变成 ApplyToRow 格式规则
  • 每个答案都会替换上一个答案,Undo 可后退一步
  • LastExplanation 说明哪些已被应用、哪些被忽略;提供程序失败时,由基于规则的解析器作答
  • sgcGridWS 桥接保留了搭配 TsgcHTMLAIAssistant 的 TsgcGridAIQuery,还提供 TsgcGridFeedSource_WebSocket、TsgcGridFeedSource_MQTT 和 TsgcGridFeedSource_SSE,它们按键把 JSON 消息写入网格

每个版本均可使用,包括社区版,适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。sgcWebSockets 提供程序和 sgcGridWS 桥接需要 sgcWebSockets 和注册版。

阅读帮助主题

无障碍

面向屏幕阅读器的 UI Automation、键盘和高对比度,无需任何设置。

无障碍

作为真正的表格公开的网格

sgcGrid 将其内容作为带有列标题、行和单元格的表格向 Microsoft UI Automation 公开,Narrator 和 NVDA 等屏幕阅读器使用的正是这一 API。只会构建可见的行,行数和列数始终是完整的数量,因此拥有一百万行的网格不会带来额外开销。

  • 焦点单元格、选择、排序、筛选、分组和树形行通过 Grid、Table 和 Selection 模式公开
  • 方向键、Home、End、Page Up 和 Page Down 移动焦点单元格,Shift 扩展选择,Ctrl+Space 切换行或单元格,F2 或 Enter 进行编辑
  • Alt+Down 打开筛选弹出窗口,Alt+Shift+Left 和 Alt+Shift+Right 移动列,Ctrl+Shift+G 按焦点列分组,Ctrl+Shift+U 取消该分组
  • 可见的焦点环,在 Windows 高对比度主题下,网格使用系统颜色绘制

无障碍功能在每个版本中默认开启,包括免费的社区版,可用于 VCL(Delphi 和 C++Builder 从 Delphi 7 到 Delphi 13 的每个版本)、Windows 上的 FireMonkey,以及 WinForms、WPF 和 Avalonia。在 Delphi 和 C++Builder 中,AccessibleName 和 AccessibleDescription 设置向 UI Automation 公开的名称和说明,在 .NET 中,各框架标准的无障碍名称和帮助文本起同样的作用。请参见无障碍符合性报告。在没有表格模式的 Avalonia 上,每个单元格在其名称和帮助文本中带有自己的列和位置。列宽只能用鼠标调整。

阅读帮助主题

查看 sgcGrid 的实际效果

sgcUI 套件演示中的 sgcGrid:使用内置模拟数据、可离线运行的完整应用程序。

几毫秒渲染一帧 1080p 画面

sgcGrid QA 性能关卡最近一次测得的平均值:1920 x 1080 画面,12 列、100,000 行、45 个可见行,在光栅画布上渲染 60 次。在 Win64 上每帧超过 16 毫秒、在 Win32 上超过 25 毫秒时,该关卡判定失败。

测量项结果条件
普通帧3.0 毫秒Win32
普通帧4.6 毫秒Win64
普通帧3.7 毫秒Linux64
闪烁加 3 条格式规则3.2 毫秒Win32
闪烁加 3 条格式规则6.8 毫秒Win64
LiveTicker 演示,工作线程写入每秒约 1,000 次更新已排序、闪烁的网格,60 fps

来源:记录这些数据的帮助主题。

谁在用 sgcGrid 构建应用

交易和行情数据台

行情板必须在数百个价格每秒变化时仍保持可读。数据源线程用 UpdateRow 写入,从不等待界面,变化时闪烁显示每次变动的方向,尾随模式让成交日志停留在最新一笔。sgcGridWS 桥接可以从 WebSocket、MQTT 或 SSE 读取行情。

  • 实时更新
  • 变化时闪烁
  • 尾随模式
  • 实时数据流
运行 LiveTicker 演示

后台办公和业务系统

订单录入、库存清单和开票界面都依托于数据库。绑定现有的 TDataSet,让用户按客户或月份分组并在每个分组行中查看合计,通过验证就地修正数值,再导出一个工作簿,财务部门打开后分组和 SUBTOTAL 公式完好无损。

  • 数据集绑定
  • 分组与汇总
  • 就地编辑
  • Excel 导出
运行 DataSetGrid 演示

监控、日志和告警

运维界面展示永不终止的事件流。MaxRows 限制日志大小,格式规则把错误涂成红色,虚拟模式可按需浏览包含数百万行的归档。在 Linux64 服务器上,渲染器可将同一个网格写成 PNG 或 SVG 文件,用于告警邮件。

  • 格式规则
  • MaxRows 与尾随模式
  • 虚拟模式
  • 无界面 PNG 和 SVG
运行 LiveFeed 演示

几行代码实现实时网格

Delphi、C++ Builder 和 C# 中使用相同的 API:添加列,按键追加行,之后从任意线程更新。

用代码创建的 VCL 网格:带类型的列、按键追加的行,以及从任意线程按字段名进行的更新。

uses
  Forms, Classes, Controls,
  sgcGrid_Columns, sgcGrid_Data, sgcGrid_VCL;

procedure CreateGrid(aForm: TForm);
var
  oGrid: TsgcVCLGrid;
begin
  oGrid := TsgcVCLGrid.Create(aForm);
  oGrid.Parent := aForm;
  oGrid.Align := alClient;
  // the columns: FieldName, Caption and DataType
  oGrid.Columns.Add('Symbol', 'Symbol');
  oGrid.Columns.Add('Price', 'Price', gdtFloat).DisplayFormat := '0.00';
  oGrid.Columns.Add('Volume', 'Volume', gdtInteger);
  // one row per key, the values in column order
  oGrid.Data.AppendRow('MSFT', ['MSFT', 412.5, 1200]);
  oGrid.Data.AppendRow('AAPL', ['AAPL', 228.1, 3400]);
  // later, from any thread: update the row of a key by field name
  oGrid.Data.UpdateRow('MSFT', ['Price', 'Volume'], [413.1, 1350]);
end;

阅读帮助主题 →

C++ Builder 中使用生成的 sgcGrid 头文件实现的同一个网格。

#include "sgcGrid_Columns.hpp"
#include "sgcGrid_Data.hpp"
#include "sgcGrid_VCL.hpp"

void __fastcall CreateGrid(TForm *Form)
{
  TsgcVCLGrid *Grid = new TsgcVCLGrid(Form);
  Grid->Parent = Form;
  Grid->Align = alClient;
  // the columns: FieldName, Caption and DataType
  Grid->Columns->Add("Symbol", "Symbol", gdtText);
  Grid->Columns->Add("Price", "Price", gdtFloat)->DisplayFormat = "0.00";
  Grid->Columns->Add("Volume", "Volume", gdtInteger);
  // one row per key, the values in column order
  Grid->Data->AppendRow("MSFT", OPENARRAY(Variant,
    (Variant("MSFT"), Variant(412.5), Variant(1200))));
  Grid->Data->AppendRow("AAPL", OPENARRAY(Variant,
    (Variant("AAPL"), Variant(228.1), Variant(3400))));
  // later, from any thread: update the row of a key by field name
  Grid->Data->UpdateRow("MSFT",
    OPENARRAY(String, (String("Price"), String("Volume"))),
    OPENARRAY(Variant, (Variant(413.1), Variant(1350))));
}

阅读帮助主题 →

带闪烁单元格、负变化规则和深色主题的 WinForms 网格。

using System.Windows.Forms;
using esegece.sgcGrid;
using esegece.sgcUICore;

internal class MainForm : Form
{
    private readonly TsgcWinFormsGrid Grid = new TsgcWinFormsGrid();

    public MainForm()
    {
        Grid.Dock = DockStyle.Fill;
        // the columns: field name, caption and data type
        Grid.Columns.Add("symbol", "Symbol");
        Grid.Columns.Add("price", "Price", TsgcGridDataType.gdtFloat).DisplayFormat = "#,##0.00";
        Grid.Columns.Add("change", "Change", TsgcGridDataType.gdtFloat).DisplayFormat = "+0.00;-0.00;0.00";
        Grid.Columns.Add("volume", "Volume", TsgcGridDataType.gdtInteger).DisplayFormat = "#,##0";
        // changed cells flash and fade, negative rows are tinted red
        Grid.FlashChanges = true;
        Grid.FormatRules.Add("change", TsgcGridFormatOperator.gfoLess, "0", 0x30E53935).ApplyToRow = true;
        Grid.Theme = TsgcUITheme.utDark;
        // one row per key, the values follow the column order
        Grid.Data.AppendRow("MSFT", "MSFT", 412.5, 0.0, 1200);
        Grid.Data.AppendRow("AAPL", "AAPL", 228.1, 0.0, 3400);
        Controls.Add(Grid);
    }

    // call it from any thread: TsgcGridData is thread safe
    public void OnQuote(string aSymbol, double aPrice, double aChange, int aVolume)
    {
        Grid.Data.UpdateRow(aSymbol, new[] { "price", "change", "volume" },
            new object[] { aPrice, aChange, aVolume });
    }
}
dotnet add package esegece.sgcGrid.WinForms

阅读帮助主题 →

运行 sgcGrid 演示

15 个 Delphi 演示(其中三个为 FireMonkey)、11 个 C++ Builder 演示,以及 18 个适用于 WinForms、WPF 和 Avalonia 的 .NET 演示。

LiveTicker

LiveTicker

工作线程每秒通过 UpdateRow 推送约 1,000 次价格更新,配合已排序视图、闪烁单元格和针对负变化的格式规则。支持 VCL、FireMonkey、C++ Builder、WinForms、WPF 和 Avalonia。

DataSetGrid

DataSetGrid

一个 TsgcGridSource_DataSet 绑定到包含 200 条记录的 TClientDataSet,使用 KeyField、AutoColumns 和 LiveUpdates,并支持 JSON 和 CSV 的导出与导入。

GroupAndSummary

GroupAndSummary

100,000 张订单按 Region 和 Category 分组,带分组面板、Count、Sum 和 Average 汇总、页脚和两个冻结列。.NET 中称为 Grouping。

FilterAndFind

FilterAndFind

10 万行销售数据,配有漏斗弹出窗口、筛选行和查找面板,另有列选择器、最佳列宽,以及保存到文件后再重新加载的布局。适用于 VCL、FireMonkey、C++ Builder、WinForms、WPF 和 Avalonia。

BandsAndCells

BandsAndCells

2,000 个交易品种,位于 Instrument、Live data、Price 和 Position 带区之下,带有迷你图、进度条和图像单元格、多行选择以及 Copy 按钮。适用于 VCL、C++ Builder 和 WinForms。

仅限注册版 Editing

一个下拉列表列、一个用空格键切换的布尔列、拒绝负数量的 OnValidate、OnEditError 以及 OnEdited 日志,另有来自 sgcEditors 的日期、时间、数字、颜色和令牌编辑器,通过 OnCreateEditor 放入的 TTrackBar,以及粘贴、撤销和重做。

DataSetEditing

仅限注册版 DataSetEditing

产品和类别存放在两个 TClientDataSet 中,TDBNavigator 和两个 TDBEdit 与网格共用同一批记录:包括 WriteBack、SyncCursor、查找列、插入、删除和撤销。适用于 VCL、C++ Builder 和 WinForms(带 AddLookup 的 DataTable)。

TreeAndDetail

仅限注册版 TreeAndDetail

一个组织结构图树,以及带有订单明细带的客户,明细带通过 TsgcGridDataStore 填充。

仅限注册版 ExcelExport

一个分组网格和一个树形网格通过 SaveToXLSX 保存,并在电子表格应用中打开,分级显示和汇总得以保留。

GridAndChart

仪表板上的一个网格磁贴和一个图表磁贴:TsgcChartDataSource_Table 绘制网格中的行。需要 sgcCharts 和 sgcDashboard。

仅限注册版 AskYourGrid

TsgcGridAI 和 AI 查询栏根据自然语言问题对 200 只股票进行筛选、排序和高亮,无需网络和 API 密钥,并与 TsgcGridAIQuery 桥接并列展示。需要 sgcWebSockets。

仅限注册版 LiveFeed

进程内 WebSocket 服务器广播包含 50 个代码的 JSON 批次,TsgcGridFeedSource_WebSocket 按键把它们写入网格。支持 Delphi 和 .NET。

预编译演示

每款 sgcUI 产品的可直接运行的可执行文件,无需安装。

下载 sgcUI_bin.zip →

sgcGrid 包含在哪些版本中

sgcGrid 可单独购买,包含在 Standard 及以上的每个 sgcUI 版本中,也包含在 All-Access 套装中。

sgcGrid 单品包

€199 / 开发者,含完整源代码,1 年更新。

购买 sgcGrid → 查看价格 →

sgcUI Standard

sgcGrid、sgcNavigation、sgcToolbar和sgcEditors,起价 €380。

查看 Standard →

sgcUI Professional

Standard 加 sgcCharts、sgcDashboard和sgcGauges,起价 €529。

查看 Professional →

sgcUI Enterprise

全部 14 款 sgcUI 产品,起价 €699。

查看 Enterprise →

免费的社区版是 NuGet 上的 esegece.sgcGrid.Community。一个项目引用社区版包或注册版包之一,不能同时引用两者。

功能社区版(免费)注册版
从任意线程实时更新、变化时闪烁、尾随模式✓✓
格式规则和主题✓✓
排序、筛选和选择✓✓
分组、分组面板和汇总✓✓
冻结列和调整列宽✓✓
虚拟模式✓✓
DataTable 绑定、JSON 和 CSV✓✓
无界面 PNG 和 SVG✓✓
列筛选器、筛选行和查找面板✓✓
列选择器、列移动、最佳列宽和布局✓✓
带区、图像、进度和迷你图单元格、多选✓✓
向网格提问:TsgcGridAI、AI 查询栏和任意 LLM 提供程序✓✓
就地编辑−✓
双向 DataTable 编辑、粘贴、撤销和重做、sgcEditors 单元格编辑器−✓
树形行和主从明细−✓
Excel 导出−✓
实时数据流、TsgcGridAIQuery 和 sgcWebSockets AI 提供程序(sgcGridWS 和 sgcUICoreWS 桥接)−✓

支持的框架与平台

sgcGrid 中的组件

组件目标
TsgcVCLGridDelphi 和 C++ Builder,VCL(sgcGrid_VCL)
TsgcFMXGrid自 XE6 起的 Delphi FireMonkey,支持 Windows、macOS、iOS 和 Android(sgcGrid_FMX)
TsgcGridData, TsgcGridColumns, TsgcGridFormatRules, TsgcGridLineView, TsgcGridRenderer与框架无关的行存储、列、格式规则和渲染器,也支持 Linux64
TsgcGridAI与框架无关的自然语言查询引擎,每个版本均可使用,也支持 Linux64(sgcGrid_AI)
TsgcVCLAIQueryBar, TsgcFMXAIQueryBar, TsgcUIAIEventProvidersgcUICore 的 AI 查询栏和 AI 提供程序,每个版本均可使用
TsgcUIAIChatProvidersgcUICoreWS 桥接:以 sgcWebSockets 的 TsgcAIChat 作为 AI 提供程序(注册版)
TsgcGridSource_DataSet, TsgcGridDataStoreTDataSet 绑定,以及主从明细带的行存储
TsgcGridFeedSource_WebSocket, TsgcGridFeedSource_MQTT, TsgcGridFeedSource_SSE, TsgcGridAIQuery与 sgcWebSockets 配合的 sgcGridWS 桥接(注册版)
TsgcWinFormsGrid, TsgcWpfGrid, TsgcAvaloniaGrid.NET,WinForms、WPF 和 Avalonia
TsgcGridAI, TsgcWinFormsAIQueryBar, TsgcWpfAIQueryBar, TsgcAvaloniaAIQueryBar.NET,面向 WinForms、WPF 和 Avalonia 的自然语言查询和 AI 查询栏
目标组件平台
Delphi 7 至 13,VCLTsgcVCLGridWin32,自 XE2 起支持 Win64
Delphi XE6 至 13,FireMonkeyTsgcFMXGridWindows、macOS、iOS 和 Android
C++ Builder 2007 至 13TsgcVCLGrid, TsgcFMXGrid生成的 .hpp 头文件和静态库
Delphi 10.2 至 13,与框架无关模型、格式化、渲染器、JSON 和 CSVLinux64,例如在服务器上渲染网格图像
.NET Framework 4.7.2、.NET 8、9 和 10TsgcWinFormsGrid,以及 WPF 和 Avalonia 网格WinForms、WPF、Avalonia,无界面 PNG 和 SVG

常见问题解答

可以。网格数据的 AppendRow、UpdateRow、UpdateCell 和 DeleteRow 都是线程安全的,因此工作线程可以按键直接写入行。网格在主线程上以每秒最多 MaxFPS 次的频率重绘。请参阅实时更新。

只绘制可见行,因此一帧的开销取决于窗口,而不是行数。QA 关卡测得 100,000 行网格的 1080p 画面在 Win32 上为 3.0 毫秒,在 Win64 上为 4.6 毫秒。对于存放在别处的数据,虚拟模式不存储任何行,而是在行滚动进入视野时请求其值。请参阅性能。

可以。TsgcGridSource_DataSet 可从任意 TDataSet 填充网格,通过 AutoColumns 创建列,并在开启 LiveUpdates 时跟随数据集的每一次 Append、Edit 和 Delete。设置 KeyField 后,变化的行会就地更新而不是重新加载。在 .NET 中,同一个数据源读取 DataTable。请参阅数据集绑定。

可以。TsgcVCLGrid 是普通的 VCL 控件,因此可以与现有的 TStringGrid 或 TDBGrid 并排放在同一窗体上。TDBGrid 界面保留其数据集并添加一个 TsgcGridSource_DataSet;TStringGrid 界面则用 AppendRow 和 UpdateRow 按键写入行。现有窗体不会自动转换。

就地编辑、双向 DataTable 编辑、粘贴、撤销和重做、sgcEditors 单元格编辑器、树形行、主从明细行、Excel 导出和 sgcGridWS 桥接。排序、筛选、筛选行和查找面板、分组、汇总、冻结列、列选择器、布局、带区、图像、进度和迷你图单元格、多选、格式规则、虚拟模式、JSON 和 CSV、无界面输出以及使用 TsgcGridAI 的向网格提问在每个版本中都有。请参阅版本。

支持。GroupIndent 和 GroupPanelHeight 等尺寸采用与设备无关的像素,VCL 网格会按其所在显示器的 DPI 缩放,自 Delphi 10.3 起支持按显示器缩放。Theme 在 utLight 和 utDark 之间切换,AccentColor 设置选中和闪烁的强调色。

sgcGrid 帮助

3,000+开发者
20+年
761+组件
30+API 集成
5平台
30 天退款保证不满意?可在购买后 30 天内申请全额退款。 查看退款政策

立即试用 sgcGrid

sgcUI 试用版包含解锁全部功能的 sgcGrid、其他 13 款 sgcUI 产品以及所有演示项目。