张三(销售主管)
   --李四(销售主任)
       --小李(组员)
       --小李(组员)
   --小王(销售主任)数据结构是这样的:表Sales(销售人员表)
SaleID  SaleName  ParentID
 1        张三      0
 2        李四      1
 3        小李      2
 4        小李      2
 5        小王      1
我的问题是,如当"李四"登录,只能看他本人和他所有子节数据.请问该怎么实现

解决方案 »

  1.   

    <asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" >
                    </asp:TreeView>private void populateTreeView(TreeView tree)
        {
            TreeNode rootNode = new TreeNode("配菜管理", "0");
            rootNode.PopulateOnDemand = true;
            tree.Nodes.Add(rootNode);
        }    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            FoodStuffCatalogCollection catalogs = FoodStuffCatalogBll.GetByParent(Convert.ToUInt32(e.Node.Value));
            TreeNode childNode = null;
            foreach (FoodStuffCatalog catalog in catalogs)
            {
                childNode = new TreeNode(catalog.Name,catalog.PrimaryKey.ToString());
                childNode.PopulateOnDemand = catalog.HasChild;
                e.Node.ChildNodes.Add(childNode);
            }
        }
      

  2.   

    加个字段,如pathSaleID  SaleName  ParentID ,Path
     1        张三      0          1,
     2        李四      1           1,2,
     3        小李      2           1,2,3,
     4        小李      2           1,2,4,
     5        小王      1           1,5,查询的时候如果查李四,那就path like '%,2,%'
      

  3.   

    就要升级了,努力一下,同意幕白兄那样得到指定id的所有子分类的方法
    下面是我写的代码
    protected void Page_Load(object sender, EventArgs e)
        {
            /*
             SaleID SaleName ParentID
    1 张三 0
    2 李四 1
    3 小李 2
    4 小李 2
    5 小王 1
    我的问题是,
             */
           //添加数据
            DataTable dt = new DataTable();        dt.Columns.Add("SaleID"); dt.Columns.Add("SaleName"); dt.Columns.Add("parentID");        DataRow dr = dt.NewRow();
            dr["SaleID"] = 1; dr["SaleName"] = "张三"; dr["ParentID"] = 0;
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr["SaleID"] = 2; dr["SaleName"] = "李四 "; dr["ParentID"] = 1;
            dt.Rows.Add(dr); dr = dt.NewRow();
            dr["SaleID"] = 3; dr["SaleName"] = "小李"; dr["ParentID"] = 2;
            dt.Rows.Add(dr); dr = dt.NewRow();
            dr["SaleID"] = 4; dr["SaleName"] = "小李"; dr["ParentID"] = 2;
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr["SaleID"] = 5; dr["SaleName"] = "小王"; dr["ParentID"] = 1;
            dt.Rows.Add(dr);
            //当前要输出的id
            int userID = 1;
            DataRow row=dt.Select("saleID="+userID)[0];
            TreeNode n = new TreeNode(row["saleName"].ToString(), row["saleID"].ToString());
            //添加第一项
            this.TreeView1.Nodes.Add(n);
            BindTree(dt,n, userID);    }    void BindTree(DataTable dt, TreeNode n, int parentID) {
            DataRow[] rows = dt.Select("parentID=" + parentID);
            foreach (DataRow dr in rows) {
                TreeNode c_Node = new TreeNode(dr["saleName"].ToString(), dr["saleID"].ToString());
                n.ChildNodes.Add(c_Node);
                BindTree(dt, c_Node, Convert.ToInt32(dr["SaleID"]));
            }    }
      

  4.   

    可以在服务器端代码中以编程方式将 TreeNode 对象填充到 TreeView 控件的 Nodes 集合中,也可以利用 TreeView 控件的 PopulateOnDemand 功能在客户端上的父节点展开时动态填充节点。即需填充功能允许您指定在最初呈现 TreeView 控件时不使用数据填充节点。相反,TreeNode 控件将在用户单击节点时请求子节点数据。当 TreeNode 控件的 PopulateOnDemand 属性被设置为 true 时,如果用户单击并展开该节点,则发生 TreeNodePopulate 事件。您可以创建一个事件处理程序,以在引发 TreeNodePopulate 事件时动态检索数据,这样就可以根据需要检索树数据。
      

  5.   

    我的问题是,如当"李四"登录,只能看他本人和他所有子节数据.请问该怎么实现========基于你目前的表结构,可以这样 ->1。 SQL Server 中递归获取子代节点记录-- http://community.csdn.net/Expert/TopicView3.asp?id=5603719
    -- 测试数据
    CREATE TABLE Catalog( 
    [ID] int primary key,
        TypeName varchar(100),
        SupTypeID int
    )
    INSERT INTO Catalog
    SELECT 1, 'Agriculture', 0
    UNION 
    SELECT 2, 'Apparel & Fashion', 0
    UNION 
    SELECT 3, 'Automobile', 0
    UNION 
    SELECT 4, 'Business Services', 0
    UNION 
    SELECT 5, 'Agriculture & By-product Agents', 1
    UNION 
    SELECT 6, 'Agriculture Product Stocks', 1
    UNION 
    SELECT 7, 'Agriculture Products Processing', 1
    UNION 
    SELECT 8, 'Other', 6
    UNION 
    SELECT 9, 'Animal Extract', 6
    UNION 
    SELECT 10, 'Animal Fodders', 7GOCREATE TABLE Product(
    PID int primary key,
      ProductName varchar(100),
    TypeID int,
    State int
    )
    INSERT INTO Product
    SELECT 1, 'dfdsf', 8, 1
    UNION
    SELECT 2, 'dfdsfdsf', 9, 0
    UNION
    SELECT 3, 'dfdfd32', 10, 1
    UNION
    SELECT 4, 'dsfdsf', 8, 1
    UNION
    SELECT 5, 'dfdsfds', 6, 2GO-- 存储过程, 临时表版本
    CREATE PROCEDURE dbo.usp_SearchProductByAncestorCatalog(
    @AncestorCatalogId int
    )
    AS
    SET NOCOUNT ON

    -- 目录树临时表
    CREATE TABLE #CatalogTree(
    CatalogId int,
    Generation int)
    DECLARE 
    @Generation int 

    SET @Generation = 1

    INSERT INTO #CatalogTree 
    SELECT @AncestorCatalogId, @Generation 

    WHILE @@RowCount > 0
    BEGIN
    SET @Generation = @Generation + 1
    INSERT #CatalogTree
    SELECT c.[ID], @Generation
    FROM Catalog c
    JOIN #CatalogTree t
    ON t.Generation = @Generation - 1 AND t.CatalogId = c.SupTypeId 
    END

    --SELECT * FROM #CatalogTree
    SELECT * FROM Product WHERE TypeId IN(SELECT CatalogId FROM #CatalogTree)

    SET NOCOUNT OFF

    RETURNGO-- 存储过程,表变量版本,性能比临时表好
    CREATE PROCEDURE dbo.usp_SearchProductByAncestorCatalog2(
    @AncestorCatalogId int
    )
    AS
    SET NOCOUNT ON

    -- 目录树表变量
    DECLARE @CatalogTree TABLE (
    CatalogId int,
    Generation int)
    DECLARE
    @Generation int

    SET @Generation = 1

    INSERT INTO @CatalogTree
    SELECT @AncestorCatalogId, @Generation

    WHILE @@RowCount > 0
    BEGIN
    SET @Generation = @Generation + 1
    INSERT @CatalogTree
    SELECT c.[ID], @Generation
    FROM Catalog c
    JOIN @CatalogTree t
    ON t.Generation = @Generation - 1 AND t.CatalogId = c.SupTypeId
    END

    --SELECT * FROM @CatalogTree
    SELECT * FROM Product WHERE TypeId IN(SELECT CatalogId FROM @CatalogTree)

    SET NOCOUNT OFF

    RETURNGOEXEC usp_SearchProductByAncestorCatalog 1
    EXEC usp_SearchProductByAncestorCatalog2 1
    2。 根据 1 获取的数据递归创建 TreeView 节点
     
    ASP.NET DEMO 15: 如何编程动态创建 
    TreeView http://www.cnblogs.com/Jinglecat/archive/2007/08/10/850090.html
      

  6.   

    cpp2017(慕白兄) ( ) 信誉:100 慕白兄 的招式是"四两拨千斤"
      

  7.   

    学习 Jinglecat(晓风残月 >> 问题需简洁,错误要详细)
      

  8.   

    慕白兄 提到的增加 Path 字段,有助于查询,但,却带来了 添加/删除 的额外工作,必须同步 Path 字段BTW,好像这两者经常是冤家,总是喜欢对立着干 :) 还记得 顺序表 和 链表 的差别吗?
    可以看到,每种策略,都有他的优缺点,所以优秀的设计方案,需要根据实际需求,以及大量经验的积累来抉择的Hope helpful!