主题:使用树形控件TreeView时对Item项的排序

admin 2018年12月08日 38

我这边的项目是一个IM软件,

所以要实现在线离线的排序: 

我的实现思路是:

 获取一个Team下的最后一个在线的跟第一个离线item在控件中的Index然后再根据该index拿到各自的数据;如果是上线则将上线那一项的数据跟第一个离线的数据进行交换;如果是下线则将离线那一项的数据跟最后一个在线的数据进行交换; 

需要注意的是:临界问题的处理;比如全在线时、全离线时、下线项跟最后一个在线的为同一项、上线项跟第一个离线项为同一项。

 以下代码摘自我自己代码:


/*
        *        函数功能:获取Team项子项中的第一个离线项跟最后一个在线项的index
        */
        void GetFirstOfflineAndLastOnline(HSTREEITEM hParent, HSTREEITEM& hOnline, HSTREEITEM& hOffline)
        {
                if (HasChildren(hParent))
                {
                        HSTREEITEM hChild = GetFirstChildItem(hParent);
                        if (ITEM_NULL != GetFirstChildItem(hParent))
                        {
                                ItemInfo& info = m_tree.GetItemRef(GetFirstChildItem(hParent));
                                if (EN_ITEMSTATUS_OFFLINE == info.data->m_BuddyItem.m_enItemStatues)
                                {
                                        //第一项就是离线,当前组中无在线数据
                                        hOffline = GetFirstChildItem(hParent);
                                        hOnline = ITEM_NULL;
                                        return;
                                }
                        }

                        if (ITEM_NULL != GetLastChildItem(hParent))
                        {
                                ItemInfo& info = m_tree.GetItemRef(GetLastChildItem(hParent));
                                if (EN_ITEMSTATUS_ONLINE == info.data->m_BuddyItem.m_enItemStatues)
                                {
                                        //最后一项也是在线,当前组中无离线
                                        hOffline = ITEM_NULL;
                                        hOnline = GetLastChildItem(hParent);
                                        return;
                                }
                        }

                        while (ITEM_NULL != hChild)
                        {
                                ItemInfo& info = m_tree.GetItemRef(hChild);
                                if (EN_ITEMSTATUS_OFFLINE == info.data->m_BuddyItem.m_enItemStatues)
                                {
                                        hOffline = hChild;
                                        hOnline = GetPrevSiblingItem(hChild);
                                        return;
                                }
                                hChild = GetNextSiblingItem(hChild);
                        }
                }

                hOffline = hOnline = ITEM_NULL;
        }


/*
        @        函数功能:对team项的子项进行排序
        */
        void SortOnlineOffline(HSTREEITEM hLastOnline, HSTREEITEM hFirstOffline, HSTREEITEM hCurItem, int nStatus)
        {
                if (EN_ITEMSTATUS_OFFLINE == nStatus)                //离线排序
                {
                        if (ITEM_NULL != hLastOnline && ITEM_NULL != hFirstOffline)
                        {
                                if (hLastOnline != hCurItem)
                                {
                                        ItemInfo& CurinfoRef = m_tree.GetItemRef(hCurItem);
                                        ItemInfo& OnlineinfoRef = m_tree.GetItemRef(hLastOnline);
                                        ItemInfo TempCurInfo = CurinfoRef;
                                        ItemInfo TempOnlineInfo = OnlineinfoRef;
                                        OnlineinfoRef = TempCurInfo;
                                        CurinfoRef = TempOnlineInfo;
                                }
                        }
                        else if (ITEM_NULL == hFirstOffline && ITEM_NULL != hLastOnline)        //部门中全部在线
                        {
                                if (hLastOnline != hCurItem)
                                {
                                        ItemInfo& CurinfoRef = m_tree.GetItemRef(hCurItem);
                                        ItemInfo& OnlineinfoRef = m_tree.GetItemRef(hLastOnline);
                                        ItemInfo TempCurInfo = CurinfoRef;
                                        ItemInfo TempOnlineInfo = OnlineinfoRef;
                                        OnlineinfoRef = TempCurInfo;
                                        CurinfoRef = TempOnlineInfo;
                                }
                        }
                }
                else                //上线排序
                {
                        if (ITEM_NULL != hLastOnline && ITEM_NULL != hFirstOffline)
                        {
                                if (hCurItem != hFirstOffline)
                                {
                                        ItemInfo& CurinfoRef = m_tree.GetItemRef(hCurItem);
                                        ItemInfo& OfflineinfoRef = m_tree.GetItemRef(hFirstOffline);
                                        ItemInfo TempCurInfo = CurinfoRef;
                                        ItemInfo TempOfflineInfo = OfflineinfoRef;
                                        OfflineinfoRef = TempCurInfo;
                                        CurinfoRef = TempOfflineInfo;
                                }
                        }
                        else if (ITEM_NULL == hLastOnline && ITEM_NULL != hFirstOffline)        //当前分组中全部处于离线
                        {
                                if (hCurItem != hFirstOffline)                //上线非当前组中第一项
                                {
                                        ItemInfo& CurinfoRef = m_tree.GetItemRef(hCurItem);
                                        ItemInfo& OfflineinfoRef = m_tree.GetItemRef(hFirstOffline);
                                        ItemInfo TempCurInfo = CurinfoRef;
                                        ItemInfo TempOfflineInfo = OfflineinfoRef;
                                        OfflineinfoRef = TempCurInfo;
                                        CurinfoRef = TempOfflineInfo;
                                }
                        }
                }
        }
复制代码


/*
        *        函数功能:提供外部调用状态变化
        */
        void ModifyItemByStuffStatus(const std::string& strId6d, int nStatus)
        {
                HSTREEITEM hParent = GetFirstVisibleItem();
                while (ITEM_NULL != GetNextSiblingItem(hParent))
                {
                        if (HasChildren(hParent))                //有子节点则遍历子节点
                        {
                                HSTREEITEM hChild = GetFirstChildItem(hParent);
                                while (ITEM_NULL != GetNextSiblingItem(hChild))
                                {
                                        ItemInfo& info = m_tree.GetItemRef(hChild);
                                        if (info.data->nType == 1 && info.data->m_BuddyItem.m_strId6d == strId6d)
                                        {
                                                HSTREEITEM hLastOnline, hFirstOffline;
                                                GetFirstOfflineAndLastOnline(hParent, hLastOnline, hFirstOffline);
                                                info.data->m_BuddyItem.m_enItemStatues = (EN_ITEM_STATUS)nStatus;
                                                SortOnlineOffline(hLastOnline, hFirstOffline, hChild, nStatus);
                                                break;
                                        }
                                        hChild = GetNextSiblingItem(hChild);
                                }
                        }
                        hParent = GetNextSiblingItem(hParent);
                }
                notifyBranchChanged(ITvAdapter::ITEM_ROOT);
        }