Повторно разверните элемент дерева

Я работаю над старым приложением 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?
}

0

Решение

Вы должны установить cChildren TVITEM на «один»:

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

Другие решения

Вы пытаетесь изобрести то, что библиотека общих элементов управления уже может для вас сделать.

Что вам нужно сделать, это когда вы вставляете набор «папок» itemex.cChildren = I_CHILDRENCALLBACK который скажет дереву, чтобы отправить вас TVN_GETDISPINFO уведомление, когда нужно знать, есть ли у элемента дети. Затем он аналогичным образом отправит TVN_GETDISPINFO для каждого отдельного ребенка.

Он будет отправлять уведомления только тогда, когда это абсолютно необходимо, так что вам не придется делать какие-либо дорогие вещи напрасно.

2

Я бы сказал, вам нужно изменить 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.
1
По вопросам рекламы [email protected]