虽然这个问题看似简单,但我找不到答案。
我有一个包含大量列的DBGrid组件,因此它们不适合页面并显示滚动条。我还有column-autofix机制,它使每列具有表中最长元素的宽度。当我将DBGrid滚动到右端时,在最后一列之后有一个空格。如何摆脱这个空间?
我看到的一个解决方案是拉伸最后一列以适应空白区域。但我不知道如何找到这个空地的长度! DbGrid.Width和DbGrid.ClientWidth仅给出组件部分的长度,但不给出表的实际长度。任何提示??
答案 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)事件中,以便为每个结果集只执行一次。