2011-02-28 57 views
3

如何在TListView控件中隐藏分隔空单元格与相邻单元格的网格线?这将像HTML colspan表格属性或Excel的“合并单元格”命令。我希望有文字的单元保留它们的正常边界。如何在列表视图中省略空单元格的网格线?

Example

+0

你是什么意思删除空列? – 2011-02-28 18:07:38

+0

经过一段时间的调查,似乎没有任何可靠的解决方案。 – 2011-02-28 18:25:11

+0

我从来没有完全明白为什么人们会提出尚未明确的问题。 – 2011-02-28 19:23:14

回答

3

你可以使用TVirtualStringTree。它有自动跨越空列的AutoSpanColumns选项。

+0

+1。由于我的尝试建议Windows树视图无法做到这一点(强健),第三方组件可能是一个不错的选择。 – 2011-02-28 20:43:36

+0

为什么这是低调的? – 2011-02-28 21:35:21

+1

@Andreas - 不确定,但也许是因为答案不是以*开始回答问题,但是.. * .. – 2011-02-28 22:54:09

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; 

Listview colspan is hard to get right. Don't do it. http://privat.rejbrand.se/listviewcolspan.png

这是不好的,因为它是不稳健。它闪烁,它是越野车,它是“哈克”。它在未来的Windows版本中可能无法正常工作。基本上,Windows列表视图控件不应该像HTML那样做colspan,我想。

+0

但我需要网格线:( – Kermia 2011-02-28 20:11:42

+0

@Kermia:我尝试了很多东西,但Windows坚持把这些全部都画在控制台上...... – 2011-02-28 20:14:38

+0

谢谢Andreas :) – Kermia 2011-02-28 20:17:56

相关问题