2009-10-03 64 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)事件整理爲每個結果集僅執行一次。