重新展开树视图项

时间:2013-03-07 10:56:29

标签: c++ mfc treeview treeviewitem

我正在开发一个旧的MFC应用程序。应用程序中有一个TreeView控件。 OnItemExpanding函数被覆盖。我正在扩展它的TreeViewItem的孩子。如果第一次展开节点,则会填充其子节点。如果项目没有子项,则从TreeViewItem中删除展开图标(+符号)。

现在的问题是我扩展了一个没有孩子的节点。完成一些工作后,将孩子添加到该节点。但是现在我无法获得新添加的孩子,因为缺少扩展图标。我如何刷新TreeView中的特定节点。我创建了一个刷新按钮。在那里我能够在TreeView中找到我当前选择的节点,但接下来是什么。

这是代码。

void CMyTreeView::OnItemExpanding(CTreeCtrl& tree, NMHDR* pNMHDR, LRESULT* pResult) 
{
   //This is only called when I click on expand (+ sign)
   //some check here which populates children.
}

void CMyTreeView::RefreshNode(CTreeCtrl& tree, HTREEITEM selectedNode)
{
    // What should I do here?
}

3 个答案:

答案 0 :(得分:2)

你必须将TVITEM的cChildren设置为'one':

TVITEM tvItem = {0};
tvItem.mask   = TVIF_HANDLE | TVIF_CHILDREN;
tvItem.hItem  = selectedNode;
tvItem.cChildren = 1;
tree.SetItem(&tvItem);

答案 1 :(得分:2)

您正在尝试重新发明公共控件库已经可以为您做的事情。

当您插入“文件夹”项集itemex.cChildren = I_CHILDRENCALLBACK时,您需要做的是告诉树在需要知道项目是否有子项时向您发送TVN_GETDISPINFO通知。然后,它会为每个孩子发送TVN_GETDISPINFO

它只会在绝对必要时发送通知,因此您无需徒劳地做任何昂贵的事情。

答案 2 :(得分:1)

我想说,你需要改变ItemState:http://msdn.microsoft.com/de-de/library/ce034e69%28v=vs.80%29.aspx

BOOL SetItemState(    HTREEITEM hItem,    UINT nState,    UINT nStateMask );

看看HTREEITEM:

typedef struct tagTVITEM {
  UINT      mask;
  HTREEITEM hItem;
  UINT      state;
  UINT      stateMask;
  LPTSTR    pszText;
  int       cchTextMax;
  int       iImage;
  int       iSelectedImage;
  int       cChildren;
  LPARAM    lParam;
} TVITEM, *LPTVITEM;

cChildren Type: int

Flag that indicates whether the item has associated child items. This member can be one of the following values.