1

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

我有一个包含很多列的 DBGrid 组件,因此它们不适合页面并出现滚动条。我还有 column-autofix 机制,它使每一列的宽度与表中最长的元素相同。当我将 DBGrid 滚动到右端时,最后一列之后有一个空白区域。如何摆脱这个空间?

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

4

3 回答 3

5

让 DBGrid 以您希望的方式运行并不总是那么容易。我决定在一个具有标准实现的项目之后使用替代数据库网格,我再也没有回头。

如果您可以使用替代网格,则有许多选项可供选择。这里甚至还有一个关于 SO的主题,其中包含很多指针。在免费的源代码选项中,我一直非常喜欢JVCL项目。

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

于 2009-10-03T14:47:31.220 回答
1

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

防爆代码:

     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;
于 2009-11-11T19:06:23.180 回答
1

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

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

于 2010-10-22T07:52:47.243 回答