【问题标题】:Adding or inserting an item to a TListView always adds it to the end when GroupView is Active当 GroupView 处于活动状态时,向 TListView 添加或插入项目总是将其添加到末尾
【发布时间】:2009-07-02 21:58:19
【问题描述】:

在 2009 年的德尔福:

当 TListView 的 GroupView 处于活动状态时,向 TListView 添加或插入项目总是将其添加到列表的末尾,而不管索引指定为参数。当 GroupView 设置为 false 时,它​​会将其添加到指定的索引处。但是当它是真的时,这种行为是看不到的。

ListView2.Items.Insert(1)

上面应该在指定的索引“1”处插入项目,但总是将其添加到列表的末尾。我在这里做错了什么?

object ListView2: TListView
Left = 32
Top = 40
Width = 161
Height = 233
BorderWidth = 5
Columns = <
  item
    AutoSize = True
  end>
DoubleBuffered = False
FlatScrollBars = True
Groups = <
  item
    Header = 'test'
    Footer = 'aksdlkajsd;flkj'
    GroupID = 0
    State = [lgsNormal]
    HeaderAlign = taLeftJustify
    FooterAlign = taLeftJustify
    Subtitle = 'adgasdfasdf'
    TopDescription = 'test desc'
    BottomDescription = 'adsfasdfasdf'
    TitleImage = 0
    ExtendedImage = 0
  end
  item
    Header = 'test1'
    GroupID = 1
    State = [lgsNormal]
    HeaderAlign = taLeftJustify
    FooterAlign = taLeftJustify
    TopDescription = 'test1 desc'
    TitleImage = 1
    ExtendedImage = 1
  end>
HideSelection = False
IconOptions.WrapText = False
Items.ItemData = {
  03D80000000500000000000000FFFFFFFFFFFFFFFF0000000000000000000000
  0003740077006F00FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000
  086100730064006600610073006400660000000000FFFFFFFFFFFFFFFF000000
  000000000000000000057400680072006500650000000000FFFFFFFFFFFFFFFF
  000000000000000000000000036F006E00650000000000FFFFFFFFFFFFFFFF00
  00000000000000000000001866006F0075007200320033003300330033003300
  33003300330033003300330033003300330033003300330033003300}
MultiSelect = True
GroupView = True
ParentDoubleBuffered = False
ShowColumnHeaders = False
TabOrder = 0
ViewStyle = vsReport

结束

和添加项目@索引0的代码

procedure TForm1.Button1Click(Sender: TObject);
var
  oListItem: TListItem;
begin
  oListItem := ListView2.Items.Insert(0);
  oListItem.Caption := 'CCCCCCCC';
  oListItem.GroupID := 0;
end;

感谢和问候, 帕万。

【问题讨论】:

  • 还有别的东西(见我的回答)。发布您的 ListView 属性和/或代码。
  • 请注意当ViewStyle = vsReport 时会出现这个问题
  • 到底有没有人找到解决这个问题的方法?我尝试了所有答案,但它们不起作用!

标签: delphi delphi-2009


【解决方案1】:

这可能取决于您更改的其他属性(例如 SortType)。
我尝试了一个简单的文本列表(ViewStyle =vsList),它在指定的索引处插入 GroupView 是否设置:

  object ListView1: TListView
    Left = 24
    Top = 16
    Width = 250
    Height = 150
    Columns = <>
    Items.ItemData = {
      03480000000200000000000000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000
      00057400650073007400310000000000FFFFFFFFFFFFFFFF00000000FFFFFFFF
      000000000574006500730074003200}
    GroupView = True
    TabOrder = 0
    ViewStyle = vsList
  end

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListView1.Items.Insert(1).Caption := Edit1.Text;
end;

【讨论】:

  • ViewStyle = vsReport的时候好像不行,如果我想在指定的索引处插入,那我需要在ViewStyles之间来回切换吗?
  • 只有在 GroupView 处于活动状态并且项目与组关联时才会出现此问题
  • 您必须设置组 ID 才能让项目出现在组中。
  • 以下答案在 Listview 的 vsIcon 模式下对我有用。对于不同的问题 - 插入操作后订单未正确反映(与 groupview 无关,即禁用)。谢谢大家。
【解决方案2】:

我在 Delphi XE 中遇到了这个问题。无论是 Delphi 如何包装 COM 控件或 COM 控件本身,它似乎都非常重要。奇怪的是,在项目列表中,项目的顺序正确,只是显示不正确。

为了解决这个问题,我最终删除了 TListView 中的所有项目,然后将它们重新添加。

procedure RefreshListView(const ListView: TListView);
  var ListItem : TListItem;
      List : TList<TPair<String,Boolean>>;
      Pair : TPair<String,Boolean>;
begin
  List := TList<TPair<string,Boolean>>.Create;
  try
    ListView.Items.BeginUpdate;
    try
      //To get the sorting to work right in the listview with GridView and vsReport
      //You have to rebuild the list completely
      for ListItem in ListView.Items do
      begin
        List.Add(TPair<String,Boolean>.Create(ListItem.Caption,ListItem.Selected));
      end;

      ListView.Items.Clear;

      for Pair in List do
      begin
        with ListView.Items.Add do
        begin
          Caption := Pair.Key;
          Selected := Pair.Value;
        end;
      end;
    finally
      ListView.Items.EndUpdate;
    end;
  finally
    List.Free;
  end;
end;

这不是最好的解决方案,但它似乎可以工作(此代码是用 Delphi XE 编写的,但应该可以在 Delphi 2009+ 中工作)。

【讨论】:

  • 你是个天才!这解决了我在 Delphi XE5 中列表视图的 vsIcon 模式的问题(插入操作后顺序没有正确反映(与 groupview 无关,即禁用))。确实,对象按预期就位,但如果不使用上述代码,显示就跟不上。
【解决方案3】:

您可能需要将新的 ListItem 分配给 GroupIndex,假设您首先添加了至少 1 个 Group 并为其指定了 ID。

var 
  item:  TListItem;
begin
  item:= ListView.Items.Add;
  item.GroupID=0;
end;

或者你可以先创建 TListItem 对象,给它 GroupID 并使用 ListView.Items.AddItem(item, index) 将它添加到 ListView。

【讨论】:

  • 不需要组。请参阅我的回复,它应该在没有组的情况下工作。
  • 这无济于事。忽略位置的是Windows控件。
【解决方案4】:

BeginUpdate/EndUpdate 有助于避免这种情况。 这段代码应该可以正常工作

procedure TForm1.Button1Click(Sender: TObject);
var
  oListItem: TListItem;
begin
 ListView2.Items.BeginUpdate;
 oListItem := ListView2.Items.Insert(0);
 oListItem.Caption := 'CCCCCCCC';
 oListItem.GroupID := 0;
 ListView2.Items.EndUpdate;
end;

【讨论】:

  • (Begin|End)Update() 应该包含在 try..finally 块中:ListView2.Items.BeginUpdate; try ... finally ListView2.Items.EndUpdate; end;
  • 这无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2021-06-27
  • 2023-01-01
  • 1970-01-01
相关资源
最近更新 更多