有这样一组数据:
1 a
1.1 b
1.2 c
1.3 d
1.3.1 e
1.3.2 f
1.3.2.1 g
1.3.2.2 h
1.3.3 i
1.4 j
1.4.1 k
1.5 m
.....
上面的数据是从sql server里读出来的。利用VC中的树型控件和前面一组数据,以后面的字母名称为节点名称组成一个树型结构。谢谢大家。代码如何写?
上面的数据只是实例,不一定就是它们,只是相仿的形式。可能要递归。谢谢
1 a
1.1 b
1.2 c
1.3 d
1.3.1 e
1.3.2 f
1.3.2.1 g
1.3.2.2 h
1.3.3 i
1.4 j
1.4.1 k
1.5 m
.....
上面的数据是从sql server里读出来的。利用VC中的树型控件和前面一组数据,以后面的字母名称为节点名称组成一个树型结构。谢谢大家。代码如何写?
上面的数据只是实例,不一定就是它们,只是相仿的形式。可能要递归。谢谢
如果是,就不是问题了,先排序,再按父子关系用InsertItem()就行,这不难吧,用不用递归看你高不高兴用,不用完全可以。
void CmaketreeDlg::InitTree(void)
{
//我将树项的位置放入itemsPos数组里,对应的项文本放在itemValue数组里,
//你可以通过ADO从数据库里读出来放在数组里面,请注意要是排序后的
vector<CString> itemsPos;
vector<CString> itemValue;
itemsPos.push_back("1");
itemValue.push_back("a");
itemsPos.push_back("1.1");
itemValue.push_back("a.a");
itemsPos.push_back("1.1.1");
itemValue.push_back("a.a.a");
itemsPos.push_back("1.1.2");
itemValue.push_back("a.a.b");
itemsPos.push_back("1.2");
itemValue.push_back("a.b");
itemsPos.push_back("2");
itemValue.push_back("b");
itemsPos.push_back("2.1");
itemValue.push_back("b.a");
itemsPos.push_back("2.2");
itemValue.push_back("b.b");
itemsPos.push_back("2.2.1");
itemValue.push_back("b.b.a");
itemsPos.push_back("2.2.2");
itemValue.push_back("b.b.b");
itemsPos.push_back("2.3");
itemValue.push_back("b.c");
itemsPos.push_back("3");
itemValue.push_back("c");
itemsPos.push_back("3.1");
itemValue.push_back("c.a");
itemsPos.push_back("3.2");
itemValue.push_back("c.b");
itemsPos.push_back("3.3");
itemValue.push_back("c.c");
//生成树
HTREEITEM hTreeItem;
hTreeItem =tree1.InsertItem (_T("根项"),0,0);
for(int i=0;i<itemsPos.size();i++)
{
hTreeItem=tree1.GetRootItem();
vector<int> vPos;
Split(itemsPos.at(i),vPos);
for(int j=0;j<vPos.size()-1;j++)
{
hTreeItem=tree1.GetChildItem(hTreeItem);
for(int k=0;k<vPos.at(j)-1;k++)
{
hTreeItem=tree1.GetNextSiblingItem(hTreeItem);
}
}
tree1.InsertItem(itemValue.at(i),hTreeItem);
}
tree1.Expand(tree1.GetRootItem(),TVE_EXPAND);
}
//将“1.2.1”之类的字符串变成“1”、“2”、“1”的整型放入数组
void CmaketreeDlg::Split(CString itemPos, vector<int> & vPos)
{
int iPos=itemPos.Find(".");
while(iPos>-1)
{
vPos.push_back(atoi(itemPos.Left(iPos)));
itemPos=itemPos.Mid(iPos+1);
iPos=itemPos.Find(".");
}
vPos.push_back(atoi(itemPos));
}
CStringArray arrName;
arrChapter.Add("1");
arrChapter.Add("1.1");
arrChapter.Add("1.2");
arrChapter.Add("1.3");
arrChapter.Add("1.3.1");
arrChapter.Add("1.3.2");
arrChapter.Add("1.3.2.1");
arrChapter.Add("1.3.2.2");
arrChapter.Add("1.3.3");
arrChapter.Add("1.4");
arrChapter.Add("1.4.1");
arrChapter.Add("1.5");
arrChapter.Add("2");
arrChapter.Add("2.1");
arrName.Add("a");
arrName.Add("b");
arrName.Add("c");
arrName.Add("d");
arrName.Add("e");
arrName.Add("f");
arrName.Add("g");
arrName.Add("h");
arrName.Add("i");
arrName.Add("j");
arrName.Add("k");
arrName.Add("l");
arrName.Add("m");
arrName.Add("n");
HTREEITEM hTree;
hTree = m_tree.InsertItem("目录", TVI_ROOT, TVI_LAST);
CStringArray arrTemp;
CString strTemp;
for(int i=0; i<arrChapter.GetSize(); i++)
{
strTemp = arrChapter[i];
char *ss=strTemp.GetBufferSetLength(strTemp.GetLength());
char *p;
arrTemp.RemoveAll();
for ( p=strtok(ss, "."); p!=NULL; p=strtok(NULL, ".") )
{
arrTemp.Add(p);
}
hTree = m_tree.GetRootItem(); for(int j=0; j<arrTemp.GetSize()-1; j++)
{
hTree = m_tree.GetChildItem(hTree);
for(int k=0; k<atoi(arrTemp[j])-1; k++)
{
hTree = m_tree.GetNextSiblingItem(hTree);
}
}
m_tree.InsertItem(arrChapter[i], hTree, TVI_LAST);
}