现有City表 Customer表 两个表City表设计为:
CityId          City      FatherCityId
  1             中国          0
  2             江苏          1
  3             南京          2
  4             苏州          2注:此表是无限级分类的Customer表设计是:
CustomerId      Customer        CityId
    1             XXX             3    
    2             XXX             3  
    3             XXX             4  
    4             XXX             4  
  因已完成C/S系统已经用这样子的表,所以表结构无法改变,我现在想在B/S中实现两个表关联的树形菜单,请大家帮忙看看有什么办法.
(本人新手,请多多指教)求测试成功的完整代码!

解决方案 »

  1.   

    首先将两个表数据放入DataTable,CityTable and CustomerTable.
    TreeNode root = new TreeNode();
    root.Text = "中国城市";
    先对城市递归
    GetChildren(root);private void GetChildren(TreeNode node)
    {
       TreeNode node = null;
       foreach (DataRow row in CityTable.Rows)
       {
          node = new TreeNode();
          if (row[FatherCityId].ToString().Trim() == node.value)
          {
              node.value = row[City].ToString();
              node.Tag = row[CityId].ToString();
              root.nodes.add(node);
          }
          foreach (DataRow cusRow in CustomerTable)
          {
              TreeNode customers = null;
              if (cusRow[CityId].ToString().Trim() == node.Tag)
              {
                  customers = new TreeNode();
                  customers.value = cusRow[Customer].ToString();
              }
              node.nodes.add(customers);
          }
          GetChildren(node);
       }
    }直接写的,没测试,可能有错,请原谅!
      

  2.   

    jedliu(21世纪什么最贵? 人才!) 你给的代码测试下来不行呀,错误多的没办法改,汗的.
      

  3.   

    不好意思,机器上现在没VS,给你几个微软的文章看下,或许有帮助:
    http://www.microsoft.com/china/msdn/archives/library/workshop/webcontrols/overview/treeview.asphttp://www.microsoft.com/china/msdn/archives/library/dnaspp/html/aspnet-usingtreeviewiewebcontrol.asp
      

  4.   

    //参考下面的帖子,把SQL替换成你的SQL语句,对应的字段换成你的字段即可.
    http://www.microsoft.com/china/community/Column/30.mspx
      

  5.   

    好了,这个测试过,可以了!
    private void CreateData()
    {
    CityTable.Columns.Add(new DataColumn("CityId"));
    CityTable.Columns.Add(new DataColumn("City"));
    CityTable.Columns.Add(new DataColumn("FatherCityId")); DataRow row = null; row = CityTable.NewRow();
    row["CityId"] = "1";
    row["City"] = "北京";
    row["FatherCityId"] = "0";
    CityTable.Rows.Add(row); row = CityTable.NewRow();
    row["CityId"] = "2";
    row["City"] = "江苏";
    row["FatherCityId"] = "1";
    CityTable.Rows.Add(row); row = CityTable.NewRow();
    row["CityId"] = "3";
    row["City"] = "南京";
    row["FatherCityId"] = "2";
    CityTable.Rows.Add(row); row = CityTable.NewRow();
    row["CityId"] = "4";
    row["City"] = "苏州";
    row["FatherCityId"] = "2";
    CityTable.Rows.Add(row); //CustomerTalbe
    CustomerTable.Columns.Add(new DataColumn("CustomerId"));
    CustomerTable.Columns.Add(new DataColumn("Customer"));
    CustomerTable.Columns.Add(new DataColumn("CityId")); DataRow csRow = null; csRow = CustomerTable.NewRow();
    csRow["CustomerId"] = "1";
    csRow["Customer"] = "张一";
    csRow["CityId"] = "3";
    CustomerTable.Rows.Add(csRow); csRow = CustomerTable.NewRow();
    csRow["CustomerId"] = "2";
    csRow["Customer"] = "江二";
    csRow["CityId"] = "3";
    CustomerTable.Rows.Add(csRow); csRow = CustomerTable.NewRow();
    csRow["CustomerId"] = "3";
    csRow["Customer"] = "王三";
    csRow["CityId"] = "4";
    CustomerTable.Rows.Add(csRow); csRow = CustomerTable.NewRow();
    csRow["CustomerId"] = "4";
    csRow["Customer"] = "赵四";
    csRow["CityId"] = "4";
    CustomerTable.Rows.Add(csRow); TreeNode root = new TreeNode();
    CityTable.DefaultView.RowFilter = "FatherCityId=0";
    DataRowView drv = CityTable.DefaultView[0] as DataRowView;
    root.Text = drv["City"].ToString();
    root.ID = drv["CityId"].ToString();
    root.NodeData = drv["FatherCityId"].ToString();
    GetChildren(root); TreeView1.Nodes.Add(root);
    }这是数据表!模拟数据库取出的数据!
      

  6.   

    这个是递归绑定的!private void GetChildren(TreeNode node)
    {
    TreeNode cityNode = null;

    foreach (DataRow row in CityTable.Rows)
    {
    cityNode = new TreeNode();
    if (row["FatherCityId"].ToString().Trim() == node.ID)
    {
    cityNode.Text = row["City"].ToString();
    cityNode.ID = row["CityId"].ToString();
    cityNode.NodeData = node.ID;
    node.Nodes.Add(cityNode); foreach (DataRow cusRow in CustomerTable.Rows)
    {
    TreeNode customers = null;
    if (cusRow["CityId"].ToString().Trim() == cityNode.ID)
    {
    customers = new TreeNode();
    customers.Text = cusRow["Customer"].ToString();
    cityNode.Nodes.Add(customers);
    }
    }
    GetChildren(cityNode);
    }
    }
    }
      

  7.   

    凡正遇到这种东西记到用递归,BS上面用TreeView来表现
      

  8.   

    解决方案,生成一棵动态树,使用AJAX展开哪一层时在得到相应的数据来生成此树结点
      

  9.   


    http://blog.csdn.net/cho__cho/archive/2006/10/11/1330121.aspx
      

  10.   

    [email protected]
    我也要一份
      

  11.   

    MSDN上是一只表实现树形呀,那个我可以实现的呀,可是没看到在两只表中实现树形的
      

  12.   

    jedliu(21世纪什么最贵? 人才!) 大哥,你的是VS2003的吧调试出来有错,05里没有MICROSOFT....那个命名空间
      

  13.   

    哪个都没,我用的是IEwEBcONTROL控件,在网上可以下到!
      

  14.   

    其中treeview是包含在Microsoft里的!
      

  15.   

    private void BindTree()
        {
            DataSet dst = GetTreeViewData();
            TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
            foreach (DataRow masterRow in dst.Tables["province"].Rows)
            {
                TreeNode masterNode = new TreeNode((string)masterRow["province"]);
                TreeView1.Nodes.Add(masterNode);
                foreach (DataRow childRow in masterRow.GetChildRows("Children"))
                {
                    TreeNode childNode =new TreeNode((string)childRow["city"]);
                    masterNode.Expanded = false;
                    masterNode.ChildNodes.Add(childNode);
                }
            }
        }    private DataSet GetTreeViewData()
        {
            string constring = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
            SqlConnection con = new SqlConnection(constring);
            SqlDataAdapter daprovince = new SqlDataAdapter("SELECT * FROM province", con);
            SqlDataAdapter dacity = new SqlDataAdapter("SELECT * FROM city", con);
            DataSet ds = new DataSet();
            daprovince.Fill(ds, "province");
            dacity.Fill(ds, "city");
            ds.Relations.Add("Children", ds.Tables["province"].Columns["provinceid"], ds.Tables["city"].Columns["father"]);
            return ds;
        }
        #endregion #region 递归绑定同一个表数据
        private void InitTree()
        {
            DataTable dt = GetTreeViewTable();
            DataView dv = new DataView(dt);
            dv.RowFilter = "ParentID=0";
            TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
            foreach (DataRowView drv in dv)
            {
                TreeNode node = new TreeNode();
                node.Text = drv["text"].ToString();
                node.Value = drv["ID"].ToString();
                node.Expanded = false;
                TreeView1.Nodes.Add(node);
                AddReplies(dt,node);
            }
        }    private DataTable GetTreeViewTable()
        {
            string constring = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
            SqlConnection con = new SqlConnection(constring);
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM treeview", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            return dt;
        }    private void AddReplies(DataTable dt, TreeNode node)
        {
            DataView dv = new DataView(dt);
            dv.RowFilter = "ParentID='" + node.Value + "'";
            foreach (DataRowView row in dv)
            {
                TreeNode replyNode = new TreeNode();
                replyNode.Text = row["text"].ToString();
                replyNode.Value = row["ID"].ToString();
                replyNode.Expanded = false;
                node.ChildNodes.Add(replyNode);
                AddReplies(dt,replyNode);
            }
        }