有这样一组数据:
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.   

    不就是一本书保存到数据库里,再重新读出来,将目录,按章节关系显示到树控件的问题吗?
    如果是,就不是问题了,先排序,再按父子关系用InsertItem()就行,这不难吧,用不用递归看你高不高兴用,不用完全可以。
      

  2.   

    //我用了一个对话框程序,加了两个函数,对话框上放了一个树控件,对应的变量名为:“tree1”,调InitTree在窗体上就可看到树了,我只是大概的实现了功能,没有考虑效率和容错。
    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));
    }
      

  3.   

    //首先要对从数据库得到的章节排序。如果读出的就是顺序的那就不用了(废话) CStringArray arrChapter;
    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);
    }