如果是我,我会用TreeView来作

解决方案 »

  1.   

    不是很明白你的意思 你是想要图吗 
    建议你用visio
      

  2.   

    嗯,用treeview容易些,也简单些。做一个递归调用的子程序就行了
      

  3.   

    TreeView 实现的话,添加修改子项比较麻烦,我用 DataGrid 实现了这个功能,分三列,第一列显示结构(就是这个树的结构),第二列用 TextBox,让用户修改名称,描述等值,第三列是操作列,包括删除,添加子类。最麻烦是第一列,要算出每一行的深度,以及前面用的连线符号,听起来比较吓人,其实做起来也就那么回事,不太麻烦,效果还不错。
      

  4.   

    补充一下,把数据库中的数据读到一个数据表中,然后做一个递归函数,把这些数据按树结构中节点出现的次序,复制到另外一个数据表中,显示的时候在DataGrid 的 ItemDataBound中把结果显示出来。
      

  5.   

    catman3000
    不太明白你說的意思,能否給show出來看看,還有我補充一點:我的部門表已經存在,我只是想通過圖形的直觀表示,讓客戶一下子就能夠看到部門的結構另外,我的程序是winForm
      

  6.   

    用treeview。
    是用递归来生成tree。
      

  7.   

    只是显示的话就简单多了,用 Treeview 和 DataGrid 都可以实现,关键是递归函数,下面是我的部分代码,首先从数据库读出数据到一个 DataTable 中,然后再创建一个,结构上比上一个多点数据,方便以后显示,用递归函数,遍历每个元素,每访问到一个元素,就把它添加到新的DataTabel中,这样这个新的 DataTable 一定是按树显示的顺序存放的,然后就是显示了,按顺序显示出来就可以了,根据 Level(层)决定往右放名字的位置。
    private void GetPrevData()
    {
    string Sql="Select GoodsClassId,ClassName,ParentId from " + strTableName 
    + " Where DelFlag is null and GoodsClassId<>0";
    DataSet MyDataSet=myConn.CreateDataSet(Sql);
    MyDataSet.Tables.Add("NewTable");
    DataTable dt1=MyDataSet.Tables[0];
    DataTable dt2=MyDataSet.Tables[1];
    MyDT=dt2;
    dt2.Columns.Add("ClassId");
    dt2.Columns.Add("ClassName");
    dt2.Columns.Add("ParentID");
    dt2.Columns.Add("Level");
    dt2.Columns.Add("Pos"); dt2.Columns[0].DataType=System.Type.GetType("System.Int32");
    dt2.Columns[1].DataType=System.Type.GetType("System.String");
    dt2.Columns[2].DataType=System.Type.GetType("System.Int32");
    dt2.Columns[3].DataType=System.Type.GetType("System.Int32");
    dt2.Columns[4].DataType=System.Type.GetType("System.Int32"); object[] RowVals=new object[5];
    RowVals[0]=0;
    RowVals[1]="所有产品";
    RowVals[2]=0;
    RowVals[3]=-1;
    RowVals[4]=0;
    dt2.Rows.Add(RowVals); GetSortedTable(ref dt1,ref dt2,0,0); MyDG1.DataSource=dt2.DefaultView;
    MyDG1.DataBind(); } private void GetSortedTable(ref DataTable dt1,ref DataTable dt2,int Key,int Level)
    {
    int i,j;
    int bLastPos;  //*** 最后一个节点标志
    object[] RowVals; for(i=0;i<dt1.Rows.Count;i++)
    {
    bLastPos=1;
    if(Key==(int)(dt1.Rows[i][2]))
    {
    RowVals=new object[5];
    RowVals[0]=dt1.Rows[i][0];
    RowVals[1]=dt1.Rows[i][1];
    RowVals[2]=dt1.Rows[i][2];
    RowVals[3]=Level;
    for(j=i+1;j<dt1.Rows.Count;j++)
    {
    if(Key==(int)(dt1.Rows[j][2]))
    {
    bLastPos=0;  // 后面还有节点
    break;
    }
    }
    RowVals[4]=bLastPos;
    dt2.Rows.Add(RowVals);
    GetSortedTable(ref dt1,ref dt2,(int)(dt1.Rows[i][0]),Level+1);
    }
    }
    }
    #region 显示树型结构,在 ItemDataBound 中调用
    Table t=new Table();
    TableRow tr=new TableRow();
    TableCell cell=new TableCell();
    cell.Wrap=false;
    cell.VerticalAlign=VerticalAlign.Top;
    t.BorderWidth=0;
    t.CellPadding=0;
    t.CellSpacing=0; for(i=0;i<=Level;i++)
    {
    if(i!=Level)
    {
    for(j=Index-1;j>=0;j--)
    {
    if((int)(MyDT.Rows[j][3])==i)
    {
    if((int)(MyDT.Rows[j][4])==0)
    {
    cell.Text+="<img src='../Images/bar_v.gif'>";
    }
    else
    {
    cell.Text+="<img src='../Images/transparent.gif' width=20>";
    }
    break;
    }
    }
    }
    else
    {
    if(bLastPos==0)
    cell.Text+="<img src='../Images/bar_t.gif'>";
    else
    cell.Text+="<img src='../Images/bar_c.gif'>";
    }
    } tr.Cells.Add(cell); cell=new TableCell();
    cell.Wrap=false;
    cell.VerticalAlign=VerticalAlign.Middle;
    cell.Text+=ClassName;
    tr.Cells.Add(cell);
    t.Rows.Add(tr);
    PH1.Controls.Add(t);
    #endregion
      

  8.   

    阿,老大你的這是在web中的阿,web中的要好做一些我的是在winForm中,還有什嗎別的方法。
      

  9.   

    WEB 开发顺了,什么都喜欢用 WEB 来实现,如果我用 WinForm 开发,首先会选择 Treeview ,如果觉得 Treeview 显示不符合要求,我宁愿在 WinForm 把结果生成一个 HTML 页,调用IE控件,用 WEB 显示出来,用户一点也看不出有什么不一样。