Я работаю над старым приложением 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?
}
Вы должны установить cChildren TVITEM на «один»:
TVITEM tvItem = {0};
tvItem.mask = TVIF_HANDLE | TVIF_CHILDREN;
tvItem.hItem = selectedNode;
tvItem.cChildren = 1;
tree.SetItem(&tvItem);
Вы пытаетесь изобрести то, что библиотека общих элементов управления уже может для вас сделать.
Что вам нужно сделать, это когда вы вставляете набор «папок» itemex.cChildren = I_CHILDRENCALLBACK
который скажет дереву, чтобы отправить вас TVN_GETDISPINFO
уведомление, когда нужно знать, есть ли у элемента дети. Затем он аналогичным образом отправит TVN_GETDISPINFO
для каждого отдельного ребенка.
Он будет отправлять уведомления только тогда, когда это абсолютно необходимо, так что вам не придется делать какие-либо дорогие вещи напрасно.
Я бы сказал, вам нужно изменить 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.