1

質問は簡単に思えますが、答えが見つかりませんでした。

多くの列を持つ DBGrid コンポーネントがあり、その結果、列がページに収まらず、スクロールバーが表示されます。また、各列の幅がテーブル内で最も長い要素の幅になる列自動修正メカニズムもあります。DBGrid を右端までスクロールすると、最後の列の後に空白があります。このスペースを取り除く方法は?

私が見る 1 つの解決策は、空のスペースに合わせて最後の列を引き伸ばすことです。しかし、この空きスペースの長さを見つける方法がわかりません! DbGrid.Width と DbGrid.ClientWidth は、コンポーネント部分の長さのみを示しますが、テーブルの実際の長さは示しません。ヒントはありますか??

4

3 に答える 3

5

DBGrid を希望どおりに動作させるのは必ずしも簡単ではありません。標準実装を使用した 1 つのプロジェクトの後、別の db グリッドを使用することにしましたが、振り返ることはありませんでした。

代替グリッドを使用できる場合は、多くのオプションから選択できます。ここには、多くのポインターを含むSOに関するトピックもあります。ソース付きの無料オプションの中で、私は常にJVCLプロジェクトがとても好きです。

最後に 1 つだけヒントをお伝えします。想像を超えるオプションとカスタマイズの可能性を提供するグリッドがあります。この自由度にはコストが伴うことに注意してください。たとえば、コンポーネントが遅くなったり、コードへの統合が難しくなったり、またはその両方になる可能性があります。

于 2009-10-03T14:47:31.220 に答える
1

以下の回答は非常に優れていますが、OnDrawColumnCell イベントに配置されているため、まったく効果的ではありません。そのため、多数の行や列がある場合、パフォーマンスが低下する可能性があります。

その代わりに、描画イベントではなく、ソース データセットの AfterOpen (および AfterRefresh) イベントに同じコードを配置して、結果セットごとに 1 回だけ実行するようにします。

于 2010-10-22T07:52:47.243 に答える
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 に答える