如何摆脱DBGrid Delphi右侧的空白区域

时间:2009-10-03 12:47:34

标签: delphi datagrid scrollbar resize dbgrid

虽然这个问题看似简单,但我找不到答案。

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

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

3 个答案:

答案 0 :(得分:5)

让DBGrid按照您希望的方式行事并不总是那么容易。我决定在一个带有标准实现的项目之后使用替代db网格,我从不回头。

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

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

答案 1 :(得分:1)

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

Ex代码:

     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;

答案 2 :(得分:1)

下面的答案非常好,但根本没有效果,因为它放在OnDrawColumnCell事件中,所以如果有大量的行和/或列,性能可能会下降。

而不是将相同的代码放在绘图事件中,而是放在源数据集的AfterOpen(和AfterRefresh)事件中,以便为每个结果集只执行一次。