最近项目中需要建立一棵树,因为之前是做C#开发,因此对vc6中的控件和c++中的指针都很不熟悉。
希望大家能给些帮助,谢谢!
主要的问题就是建出来的树不正确,没达到预期结果,怀疑是指针使用有问题,下面贴出代码://////////////////////////Map结构的定义///////////////////////////
typedef struct tagMyData
{
unsigned long ulId; // 测点Id
unsigned long ulPId; //父节点Id
CString strName; //对象名称

tagMObject()
{
ulId = 0;
ulPId = 0;
strName = "";
};
}MyData, *LPMyData;
typedef map<unsigned long, vector<LPMyData> > MapMyData,*LPMapMyData; //Map<PId,vector<MyData> >
typedef MapMyData::value_type vtMyData;
typedef MapMyData::iterator itMyData;
///////////////////////////////////////////////////////////////////注:CMainDlg需要建树的窗体;里面有个变量,是上面Map结构的实例。
MapMyData m_MapMyData; //保存数据库中的数据  id,pid,name
下面就是建树的过程,主要参考了网上建立三态树的代码,MutiTree网上可找,
递归算法是自己写的,希望大家帮我改改,谢谢!
/////////////////////////////////////////////////////////////////////void CMainDlg::CreateTree()
{
if(m_MapMyData.size() == 0)
{
return;
} TV_INSERTSTRUCT tvinsert;
tvinsert.hParent=NULL;
tvinsert.hInsertAfter=TVI_LAST;
tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_STATE;
tvinsert.item.hItem=NULL;
tvinsert.item.state=INDEXTOSTATEIMAGEMASK( 1 );
tvinsert.item.stateMask=TVIS_STATEIMAGEMASK;
tvinsert.item.cchTextMax=6;
tvinsert.item.iSelectedImage=1; // 被选中时显示的图标
tvinsert.item.cChildren=0;
tvinsert.item.lParam=0;

tvinsert.item.pszText="PESTest测试对象"; // 节点显示的文本
tvinsert.item.iImage=0; // 当前图标
HTREEITEM hRoot = m_TripleTree.InsertItem(&tvinsert);
tvinsert.hParent = hRoot;
m_TripleTree.SetItemState( hRoot, INDEXTOSTATEIMAGEMASK(0), TVIS_STATEIMAGEMASK ); //递归建树
CreateTree(tvinsert,hRoot,m_MapMyData, 0);
}void CMainDlg::CreateTree(TV_INSERTSTRUCT tvinsert,HTREEITEM pTreeItem,MapMyData pMap, unsigned long pParend)
{
itMyData itmydata = pMap.find(pParend);
if(itmobject != pMap.end())
{
return;
}         //感觉指针用的很别扭,stl也很陌生,希望大家能救救我啊! LPMyData lpMyData;
vector<LPMyData> vctLpMyData = itmydata->second; if(vctLpMyData.size() != 0)
{
for(int i=0; i<vctLpMyData.size(); ++i)
{
lpMyData = vctLpMyData[i]; if(lpMyData->ulPId == pParend)
{
tvinsert.hParent = pTreeItem;
tvinsert.item.iImage = 0;
tvinsert.item.pszText = lpMyData->strName.GetBuffer(0);
HTREEITEM htreeitem = m_TripleTree.InsertItem(&tvinsert); m_TripleTree.InsertItem(&tvinsert);
CreateTree(tvinsert,htreeitem,pMap,lpMyData->ulId);
}
}
}
}

解决方案 »

  1.   

    假设数据库中的表内容为:
    id     pid      name
    ---------------------------
    1       0       广东省
    2       1       广州市
    3       1       深圳市
    4       2       天河区
    5       1       东莞市
    ...
    还有很多数据可是加载的树的结果为:
    + 广东省
    ---------广州市
    ----------------天河区
    ----------------天河区
    ---------广州市
    感觉加载的数据太诡异了。
      

  2.   

    sorry,是我太粗心了,郁闷,HTREEITEM htreeitem    = m_TripleTree.InsertItem(&tvinsert);
    m_TripleTree.InsertItem(&tvinsert);      //CreateTree(...)函数中多了一行谢谢各位朋友的回复。