【问题标题】:How do I load hierarchical data from a database into a tree view如何将数据库中的分层数据加载到树视图中
【发布时间】:2012-11-05 17:08:08
【问题描述】:

我有一个包含数据的数据库表,需要将字段加载到 TTreeView 对象中。

行:

ItemTree.Items.AddChild(nil, CurrentField_Text);

只需在顶层添加一个节点。

如何指定插入点?

请注意,在遍历表中的数据时,我可能(例如)插入 3 个顶级项目,然后第 4 个元素实际上是节点 2 的子节点。

如何指定?

【问题讨论】:

  • 德尔福还是拉撒路?请选择一个。或者我们可以选择适合我们的吗?
  • @DavidHeffernan 作为一个新的 freepascal 用户,我对你的问题感到惊讶。我认为它们相似(但不完全相同)。所以我不认为它会有所作为。无论如何,我正在使用 Lazarus。
  • 它们相似但不相同。所以,让我们标记它拉撒路,因为这很清楚。

标签: treeview lazarus


【解决方案1】:

这是直接从我的程序中提取的一些代码,它将从查询中获取的值插入到树视图中。

 tv.items.clear;
 with qCustTree do  // this is the query which 'feeds' the treeview
  try
   close;
   params[0].asinteger:= qCustWithCallsID.asinteger;
   open;
   tv.items.BeginUpdate;
  while not eof do
   begin
    father:= fieldbyname ('father').asinteger;
    if father = 0
     then node:= nil
     else node:= FindANode (father);
    lastnode:= tv.Items.AddChildObject (node, fieldbyname ('curdate').asstring,
                                        pointer (fieldbyname ('id').asinteger));
    next
   end;
  finally
   tv.items.endupdate;
   tv.fullexpand;
   tv.Selected:= tv.Items[0];
   tvchange (nil, tv.Selected);
  end;

如果返回元组的'father'字段为0,则在树上打开一个新的父节点,否则打开一个新的子节点。

【讨论】:

  • @noam-newman 这看起来很有希望... 什么是 POINTER?它在树上可见吗?
  • @itsols:每个节点都有一个“数据”字段,其中可以存储指向数据的指针。在代码中,我将元组中“id”字段的值保存在此字段中,以便当用户单击节点时,它“知道”它指向的记录。该数据不可见;仅显示日期。当然,您的代码可能需要显示不同的内容。
  • @noam-newman 我收到此错误:Error: Incompatible type for arg no. 3: Got "AnsiString", expected "Pointer" 尝试AddChildObject 时。在我的例子中,ID 是一个字符串。这不可能吗?
  • @itsols:不看代码就无法调试。 AddChildObject 接受三个参数:一个节点、一个字符串和一个指针(或 longint)。看起来你正试图在指针字段中存储一个字符串——你不能这样做!如果 ID 是一个字符串,那么您将不得不在树中找到一些其他方法来存储 ID。见这篇文章:delphi.about.com/od/ttreeview/a/…
  • @noam-newman 为此 +1,非常感谢您的帮助。我得到了它的工作。
【解决方案2】:

在对AddChild的调用中使用父节点代替nil,这样子就被添加到父节点中:

ParentNode := ItemTree.Items.AddChild(nil, 'Parent');
ItemTree.Items.AddChild(ParentNode, 'Child node');

【讨论】:

  • 感谢您的提示... 每个类别都有一个类别代码。有没有办法将此代码存储在树上?这段代码是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多