【问题标题】:DBGRID with Row Height variable具有行高变量的 DBGRID
【发布时间】:2015-08-27 18:10:13
【问题描述】:

我想在 DBGRID 中显示如下:

想象一下“网格”如下:

ID - 描述

1 - 网格的第 1 行
2 - 网格的第 2 行
3 - 网格的第 3 行

现在,假设DESCRIPTION列的大小发生了变化,不再出现“GRID”字样;

我也想留下 DBGRID

ID - 描述

1 - 第 1 行
网格
2 -
的第 2 行 网格
3 -
的第 3 行 网格
有没有可能??

【问题讨论】:

  • 那么您要的是数据库网格中的自动换行单元格吗?您是否希望不同的行自动成为不同的高度?还是为所有行设置一个属性?
  • 我需要自动具有不同高度的行.. 使用这个 [链接] (community.devexpress.com/blogs/thinking/VCL/Grid/…)
  • 这不是可以直接应用于数据库网格的东西。您要么必须获得该库或类似的库,要么推出您自己的自定义网格控件。我建议尽管不要使用 DB Grid - 数据感知控件,虽然很容易使东西工作,但在这样的领域变得更加困难 - 以及以过时的方式工作。您最好只使用可以具有可变行大小的标准网格 - 并手动将数据输入其中(无论如何,从这个意义上说,您将有很多自定义工作要做)。
  • 这个例子只是说明性的。我真正需要的是换行并显示该文本。 [链接] officeblogswest.blob.core.windows.net/wp-content/… 但我会尝试使用 stringgrid 组件...
  • Fwiw,devexpress tcxGrid 可以在绑定(DB-aware)和非绑定模式下使用。它的主要缺点(除了 devex VCL 库的大小)是成本。

标签: delphi delphi-xe


【解决方案1】:

不是您要的,但可能会有所帮助...我曾经使用此代码在标准 DBGrid 中显示完整的备注字段:

  TMyForm = class(TForm)
    ...
  private
    FormMemoRect: TRect;
    MemoGrid: TDBGrid;
    BMemo: TBitBtn;
    ...

Procedure TMyForm.FormMemoDeactivate(Sender: TObject);
Begin
    (Sender As TForm).Close;
    Sender.Free;
End;

Procedure TMyForm.BMemoClick(Sender: TObject);
Var FormMemo: TForm;
Begin
    MemoGrid.SetFocus;

    FormMemo := TForm.Create(Self);
    With TMemo.Create(FormMemo) Do Begin
        Parent := FormMemo;
        Align := alClient;
        ReadOnly := True;
        WordWrap := True;
        ScrollBars := ssVertical;
        Lines.Text := MemoGrid.DataSource.DataSet.Fields[TComponent(Sender).Tag].AsString;
    End;

    With FormMemo Do Begin
        OnDeactivate := FormMemoDeactivate;
        Left := FormMemoRect.Left;
        Top := FormMemoRect.Top;
        Width := Max(FormMemoRect.Right - FormMemoRect.Left, 300);
        Height := FormMemoRect.Bottom - FormMemoRect.Top;
        BorderStyle := bsNone;

        Show;
    End;
End;

Procedure TMyForm.GrdMemoDrawColumnCell(Sender: TObject; Const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
    If (gdFocused In State) Then Begin
        If Column.Field.DataType In [ftBlob, ftMemo] Then Begin
            {Desenha botão para visualização do Memo}
            FormMemoRect.Left := TWinControl(Sender).ClientToScreen(Rect.TopLeft).X;
            FormMemoRect.Right := TWinControl(Sender).ClientToScreen(Rect.BottomRight).X;
            FormMemoRect.Top := TWinControl(Sender).ClientToScreen(Rect.BottomRight).Y;
            FormMemoRect.Bottom := FormMemoRect.Top + 100;

            If Not Assigned(BMemo) Then
                BMemo := TBitBtn.Create(Self);
            BMemo.Parent := TWinControl(Sender).Parent;
            BMemo.Width := 16;
            BMemo.Height := 16;
            BMemo.Caption := '...';
            BMemo.OnClick := BMemoClick;
            BMemo.Tag := Column.Field.Index;
            BMemo.Left := TWinControl(Sender).Left + Rect.Right - BMemo.Width + 1;
            BMemo.Top := TWinControl(Sender).Top + Rect.Top + 2;

            MemoGrid := TDBGrid(Sender);
        End
        Else
            FreeAndNil(BMemo);
    End;
End;

对于 Blob/Memo 字段,您可能还会发现执行一些自定义 GetText 以直接在 Grid 中显示某些内容很有用:

Procedure TMyForm.DataSetMemoGetText(Sender: TField; var Text: String; DisplayText: Boolean);
Begin
    Text := Copy(Sender.AsString, 1, 50);

    If Text <> Sender.AsString Then
        Text := Text + '...';
End;

这就是结果的样子。

PS:对不起,代码风格不标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2011-05-13
    • 2014-03-31
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多