【问题标题】:How can I omit the grid lines of empty cells in a list view?如何在列表视图中省略空单元格的网格线?
【发布时间】:2011-07-05 22:37:18
【问题描述】:

如何在 TListView 控件中隐藏分隔空单元格与相邻单元格的网格线?它就像 HTML colspan 表格属性,或 Excel 的“合并单元格”命令。我希望其中包含文本的单元格保留其正常边框。

【问题讨论】:

  • 删除空列是什么意思?
  • 在调查了一段时间后,似乎没有任何可靠的解决方案。
  • 我一直不太明白为什么人们会赞成尚未明确的问题。
  • 我也是,@Andreas。但就此而言,我有时想知道为什么人们回答这样的问题。
  • Kermia,我已经重写了你的问题,以便它与每个人似乎都解释它的意思相匹配。如果您真的想问一些不同的问题,请发布另一个更清楚地解释您想要什么的问题。请记住,您不能仅针对某些行删除列。由于您已经在绘制图片,也许您可​​以绘制一张您希望控件看起来像的图片。

标签: delphi listview gridlines


【解决方案1】:

似乎没有任何可靠的解决方案来解决这个问题。

然而,一个糟糕的解决方案是

procedure TForm4.FormShow(Sender: TObject);
var
  i: integer;
begin
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.Add.Caption := 'Col 1';
  ListView1.Columns.Add.Caption := 'Col 2';
  ListView1.Columns.Add.Caption := 'Col 3';
  ListView1.GridLines := false; // You cannot have grid lines...
  for i := 0 to 10 do
    with ListView1.Items.Add do
    begin
      if i <> 5 then
      begin
        Caption := 'Test';
        SubItems.Add('test');
        SubItems.Add('test');
      end
      else
        Caption := 'This is a very, very long caption';
    end;
end;

var
  ColWidths: array of integer;

procedure TForm4.ListView1AdvancedCustomDraw(Sender: TCustomListView;
  const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  i, j: Integer;
begin
  if Stage <> cdPrePaint then Exit;
  if length(ColWidths) <> TListView(Sender).Columns.Count then
  begin
    SetLength(ColWidths, TListView(Sender).Columns.Count);
    Exit;
  end;
  for i := 0 to length(ColWidths) - 1 do
    if ColWidths[i] <> Sender.Column[i].Width then
    begin
      Sender.Invalidate;
      for j := 0 to length(ColWidths) - 1 do
        ColWidths[i] := Sender.Column[i].Width;
    end;
end;

procedure TForm4.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var
  r: TRect;
begin
  DefaultDraw := (Item.SubItems.Count <> 0);
  if not DefaultDraw then
  begin
    FillRect(Sender.Canvas.Handle, Item.DisplayRect(drBounds), GetStockObject(WHITE_BRUSH));
    r := Item.DisplayRect(drBounds);
    DrawText(Sender.Canvas.Handle, Item.Caption, length(Item.Caption), r, DT_SINGLELINE or DT_LEFT or DT_VCENTER)
  end;
end;

这很糟糕,因为它不健壮。它闪烁,它是越野车,它是“hacky”。它在 Windows 的未来版本中可能无法正常工作。基本上,我认为 Windows 列表视图控件不应该像 HTML 一样 colspan

【讨论】:

  • @Kermia:我尝试了很多东西,但 Windows 坚持在控件上绘制这些...
【解决方案2】:

您可以使用TVirtualStringTree。它有 toAutoSpanColumns 选项,它将自动跨越空列。

【讨论】:

  • +1。由于我的尝试表明 Windows 树视图不能(稳健地)执行此操作,因此第三方组件可能是一个不错的选择。
  • @Andreas - 不确定,但可能是因为答案不是以 Not answering the question, but.. .. 开头
  • @Sertac:是的,既然你这么说,感觉就很明显了。尽管如此,将反对票与有用的评论结合起来始终是一种好习惯。
猜你喜欢
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2017-07-15
  • 1970-01-01
  • 2023-02-20
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多