近十年前我放弃了Delphi的DBGrid,因为它根本没有用.从那以后,我使用了Virtual TreeView,它提供了很多价值,但它有一些问题.像当前的开发状态(例如None)以及没有良好数据绑定版本的事实.DevExpress的QuantumGrid以丰富的功能集而闻名,但实在是相当昂贵.我认为,对于数据绑定网格控件的95%的一般用例,其巨大的功能集可能有点过分.
有没有人知道具有以下功能的数据绑定网格控件:
我很少在网格控件中使用编辑,因此编辑功能不一定非常棒.
有什么好建议吗?
我只是想尝试使用delphi XE,在此之前我一直是Delphi7的忠实粉丝.
我看到新的dbgrid允许使用主题和渐变样式.
我正在使用渐变并设置rowselect,它具有渐变开始的属性和列标题的-end属性.
但物业在哪里设置selected color?
这很奇怪,因为颜色不匹配,selected color总是蓝色渐变.
我可以做到这一点customdraw,我只是想知道是否有任何方式改变它没有自定义绘图.
对于我们的dbgrid,我们希望不断隐藏滚动条.由于TDBGrid没有'滚动条'属性,我们使用:
ShowScrollBar(DBGrid1.Handle, SB_VERT, False);
ShowScrollBar(DBGrid1.Handle, SB_HORZ, False);
Run Code Online (Sandbox Code Playgroud)
但是,当我们调整窗口大小(以及包含dbgrid的面板)时,只有在调用上述两种方法后,滚动条才会出现并再次隐藏.
解决方案是在DrawColumnCell中调用这些方法,但这会导致dbgrid闪烁,即使DoubleBuffered设置为true也是如此.
有没有办法永久隐藏滚动条?
提前致谢!
我需要实时刷新dbgrid.关闭和打开数据集工作正常,但闪烁dbgrid.我该怎么做才能避免这种情况?
我想要像Ajax这样的解决方案,只更新必要的解决方案.
谢谢
我想格式化特定单元格强制两个小数位.数据来自ElevateDB存储过程并连接到TDataSource.
编辑:SQL编程注:
我不确定这是否只是一个ElevateDB问题.在了解Fields Editor之前,我尝试使用存储过程中的CAST(NumericField as varchar(10))语句在SQL级别格式化数据.通过这样做,它没有在字段编辑器中为此特定字段公开DisplayFormat属性.
当我从存储过程中删除CAST()语句时,DisplayFormat属性显示在字段编辑器中.
我在Delphi中使用DBGrid组件.我想知道如何设置列的格式.我有真正的价值观,我希望在网格中显示为货币.
有人知道怎么样?
当你有一个TDBGrid,全行选择,并且总是显示选择,即使没有聚焦,你想完全拥有它,你可以选择一个不赞成的事件OnDrawDataCell,一个新的事件DrawColumnCell,我选择后者并尝试这个:
procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Run Code Online (Sandbox Code Playgroud)
让我疯狂的是,我不会使用DefaultDrawColumnCell代码绘制焦点指示(高亮颜色和焦点矩形),我确信我应该调用DrawCellHighlight而不是执行上面我正在做的FillRect hack.
如果我打开DefaultDrawing,我会得到一组毛刺(奇怪的字体绘画问题),如果我将其关闭,我会得到另一组毛刺(即使在gdSelected时也没有突出显示).
DBGrids.pas DefaultDrawColumnCell中的代码除了绘制文本之外什么都不做.很明显,如果你自己接管所有绘图代码,你应该做更多.但是,DBGrids.pas所依赖的Grids.pas中内置的高亮绘图代码并非设计为从此上下文调用.我无法弄清楚我是否应该直接调用DrawCellHighlight(如上所示),并计算Col和Row值,或者我是否应该编写自己的TCustomGrid.DrawCellHighlight复杂版本来手动处理所有各种情况.
当然,这是如此简单,明显,我只是忽略它.我必须关闭DefaultDrawing,因此我必须完全从我的所有者绘制事件中绘制,并且我必须能够在主题服务不可用时运行,并且我必须在主题服务可用时使用它们.所以我需要直接调用TCustomGrid.DrawCellHighlight(我不知道如何),或者我需要完全重新实现它.
当底层数据集中的记录数大于时,是否可以从DBGrid的最顶行中获取从基础数据集显示的行号,而不是最顶行是当前选定的行. DBGrid中显示的行数,并且已滚动DBGrid.
这是我的问题.从附加到DBGrid的拖放事件处理程序,我可以使用MyGrid.MouseCoord(X,Y).Y确定drop事件与DBGrid的哪个可见行相关联.当基础数据集包含的记录数小于或等于DBGrid中显示的行数时,此值也是基础数据集中关联记录的行号.
当基础数据集包含的记录多于DBGrid中可见行数时,MyGrid.MouseCoord(X,Y).Y和TDataSet(MyGrid.DataSource.DataSet).RecNo仅在数据集的第一行出现时相同在网格的第一行.
有没有办法在没有选择DBGrid行的情况下识别DBGrid中最顶层显示记录的基础数据集(或偏移量)中的记录号?我知道如果我实际上选择了DBGrid的最顶行,那么我可以使用TDataSet(MyGrid.DataSource.DataSet).RecNo来获取底层数据集的当前记录号.但是,从DBGrid.OnDragOver或DBGrid.OnDragDrop事件我只有DBGrid和鼠标坐标的引用(我可以从中确定网格的哪一行是放置的目标).
例如,如果我可以确定DBGrid在网格的最顶行中的基础数据集中显示第三条记录,我的问题就解决了.同样,如果我可以读取特定行的底层TField(例如,最顶行)而没有选择该行,我就拥有了我需要的东西.但是,我看不到这样做的方法.
任何建议将不胜感激.
编辑:我之前发布了一篇关于拖放到DBGrid的博客.有了这个新信息,我可以解决以前已知的问题.我将在本周的某个时候更新该博客,并且一旦我这样做,就会在这里添加一个指向该博客的链接.
还有一个问题.当可见行的数量小于基础记录的数量时,我们还需要计算在最后一个可见行之后发生的下降.在最后一个可见行之后删除时,MouseCoord(x,y).Y返回-1.
以下是对Uwe代码的修改,以实现这一目的:
function TDBGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
if Value = -1 then
begin
Result := DataSource.DataSet.RecNo - Row + TopRow + VisibleRowCount
end
else
begin
Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
if dgTitles in Options then
Dec(Result);
end;
end;
Run Code Online (Sandbox Code Playgroud)
编辑:正如我在原始问题中提到的,我对这个答案很感兴趣,以便修复我的代码中实现拖放到DBGRid中的行为.有了这个答案,我已经更新了我的拖放行为,我在博客中写过这个更新.您可以在以下URL找到此讨论,包括原始博客文章的链接:拖放到DBGrid中重新访问
美好的一天的人.首先,我不是英语母语,我可能会有一些语法错误.
我需要那些做过某事或类似我的应用程序的人的建议,好吧,我正在使用我的delphi形式的TProgressBar,另一个名为"TExcelApplication"和TDBGrid的组件.
当我导出DBGrid的内容时,应用程序"冻结",所以我基本上为用户放置了ProgressBar,以查看进程完成了多少.我已经意识到,当TDBGrid检索并将每行导出到新的Excel工作簿时,您无法移动实际的表单,因此您必须等到该过程完成才能移动该表单.
那么,是否有可能做某事(我考虑过线程,但我不确定它们是否可以帮助)所以用户可以移动窗口,如果他想要的话?
非常感谢你花时间阅读并给我一个建议.我正在使用Delphi XE.
这是我用来导出行的代码:
with ZQDetalles do
begin
First;
while not EOF do
begin
i := i + 1;
workSheet.Cells.Item[i,2] := DBGridDetalles.Fields[0].AsString;
workSheet.Cells.Item[i,3] := DBGridDetalles.Fields[1].AsString;
workSheet.Cells.Item[i,4] := DBGridDetalles.Fields[2].AsString;
workSheet.Cells.Item[i,5] := DBGridDetalles.Fields[3].AsString;
workSheet.Cells.Item[i,6] := DBGridDetalles.Fields[4].AsString;
workSheet.Cells.Item[i,7] := DBGridDetalles.Fields[5].AsString;
workSheet.Cells.Item[i,8] := DBGridDetalles.Fields[6].AsString;
workSheet.Cells.Item[i,9] := DBGridDetalles.Fields[7].AsString;
Next;
barraProgreso.StepIt;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果您想查看"导出"按钮的完整代码,请随时查看此链接:http://pastebin.com/FFWAPdey