2009-10-03 90 views
1

虽然这个问题看起来很简单,但我找不到答案。如何摆脱DBGrid右侧部分的空白Delphi

我有一个包含大量列的DBGrid组件,因此它们不适合页面和滚动条出现。我也有column-autofix机制,它使每列具有表中最长元素的宽度。当我将DBGrid滚动到右端时,在最后一列之后有一个空的空格。如何摆脱这个空间?

我看到的一个解决方案是拉伸最后一列以适应空的空间。但我不知道如何找到这个空的空间的长度! DbGrid.Width和DbGrid.ClientWidth只给出组件部分的长度,但不是表的实际长度。任何提示?

回答

1

我想我找到了一个解决方案(虽然看起来有点奇怪)。为了找到DBgrid的列宽和实际宽度之间的差异(这意味着找到最后一列之后剩下的空白空间的宽度),我们需要跟踪左边显示哪一列(什么是当前列即滚动到)。我们可以使用OnDrawColumnCell事件来做到这一点,因为它只绘制现在滚动的列。然后,我们需要计算所有可见列的宽度总和,并从DBGrid的宽度中减去它的宽度。附:对不起,我的英文不好

防爆代码:

 For i:=0 to Last do 
    if Vis[i] then 
    Begin 
     Sum:=Sum+DBG.Columns[i].Width; 
     Inc(Cnt); 
    End; 

    if dgColLines in DBG.Options then 
    Sum := Sum + Cnt; 

    //add indicator column width 
    if dgIndicator in DBG.Options then 
    Sum := Sum + IndicatorWidth; 
    Dif:=DBG.ClientWidth - Sum; 
5

让DBGrid按照您希望的行为方式行事并不容易。我决定在使用标准实现的一个项目之后使用替代数据库网格,并且我从不回头。

如果您可以使用替代网格,您有许多选项可供选择。甚至有一个主题here on SO有很多指针。在免费源代码选项中,我一直很喜欢JVCL项目。

只是最后一个提示:有网格提供选项和自定义的可能性超出了你的梦想。请注意,这种自由度会带来成本,例如它可以使组件变得缓慢,难以集成到代码中,或者两者兼而有之。

1

下面的答案是相当不错的,但不是有效的,因为在所有它被放置在OnDrawColumnCell事件,因此,如果有大量的行和/或列,表现可能会下降。

取而代之的是,将相同的代码放置在绘画事件中,但要将源数据集的AfterOpen(和AfterRefresh)事件整理为每个结果集仅执行一次。