从数据库创建树视图

时间:2011-05-17 19:07:33

标签: c# database treeview

我有一个名为dtEmploye的数据库,其中包含字段

  

employe_id
  的名称
  的
   boss_id employee_id 上具有递归关系,我在代码XXX中有

我有代码但是有一些错误显示“指定的演员表无效。”

private void btntree_Click(object sender, EventArgs e)
    {
        DataTable vec = sel("SELECT * FROM dtemployee");
        treeView1.Nodes.Clear();
        foreach (DataRow dr in vec.Rows)
        {
            if ((int)dr["boss_id"] == XXX)
            {
                TreeNode parent = new TreeNode();
                parent.Text = dr["name"+"surname"].ToString();
                string value = dr["employe_id"].ToString();
                parent.Expand();
                treeView1.Nodes.Add(parent);
                sublevel(parent, value);
            }
        }
    }
    public int sublevel(TreeNode parent, string id)
    {
        DataTable ch = sel("SELECT * FROM dtEmploye WHERE boss_id=" + id);
        if (dtEmploye.Rows.Count > 0)
        {
            foreach (DataRow dr in ch.Rows)
            {
                TreeNode child = new TreeNode();
                child.Text = dr["name"+"surname"].ToString().Trim();
                string temp = dr["employe_id"].ToString();
                child.Collapse();
                parent.Nodes.Add(child);
                sublevel(child, temp);
            }
            return 0;
        }
        else
        {
            return 0;
        }
    }
    protected DataTable sel(string select)
    {
        NpgsqlDataAdapter adpt = new NpgsqlDataAdapter(select, con);
        DataTable dt2 = new DataTable();
        adpt.Fill(dt2);
        return dt2;
    }

4 个答案:

答案 0 :(得分:1)

试试这个

    if ((int)dr["boss_id"] == XXX && DBNull.Value != dr["boss_id"])
    {
        TreeNode parent = new TreeNode();
        parent.Text = dr["name"].ToString() + dr["surname"].ToString();
        string value = dr["employe_id"].ToString();
        parent.Expand();
        treeView1.Nodes.Add(parent);
        sublevel(parent, value);
    }

答案 1 :(得分:1)

为什么不在SQL中执行此操作? 您可以执行递归查询,然后可以通过使用sort循环遍历代码中的数据集来添加所有节点,以确定子节点所属的节点。

;WITH Tree (ID, [NAME], PARENT_ID, Depth, Sort) AS
(
    SELECT ID, [NAME], PARENT_ID, 0 AS Depth, CONVERT(varchar(255), [Name]) AS Sort FROM Category
    WHERE PARENT_ID = 0
    UNION ALL
    SELECT CT.ID, CT.[NAME], CT.PARENT_ID, Parent.Depth + 1 AS Depth, 
    CONVERT(varchar(255), Parent.Sort + ' | ' + CT.[NAME]) AS Sort
    FROM Category CT
    INNER JOIN Tree as Parent ON Parent.ID = CT.PARENT_ID
)

-- HERE IS YOUR TREE, Depths gives you the level starting with 0 and Sort is the Name based path
SELECT ID, [NAME], PARENT_ID, Depth, Sort FROM Tree
ORDER BY Sort

答案 2 :(得分:0)

我唯一能看到你收到此错误的地方是:

if ((int)dr["boss_id"] == XXX)

尝试做这样的事情:

if(dr["boss_id"] != null && dr["boss_id"] is int && (int)dr["boss_id"] == XXX)

答案 3 :(得分:0)

如果您提前不知道对象类型,则需要小心使用强制转换。请记住,演员表仅在“是一种”关系中有效。对于其他一切你需要进行转换。

例如:

如果你有

class Truck : Automobile

class Car : Automobile

然后

Automobile truck = new Truck();
Truck refoftruck = (Truck)truck; //correct usage;

Car badrefofTruck = (Car)truck; //will not work;

虽然汽车确实是一辆汽车(对象卡车的类型),但它也不是卡车,所以演员不会工作。要从卡车转向汽车,您必须进行某种转换。

对象和int也是如此。虽然几乎所有东西都继承自对象,但它们可以在继承链中进一步分化。你不知道对象是什么类型,所以你不知道它是int,string,double等... 因此,在这种情况下演员通常是一个坏主意。所有演员表都必须在继承链中向上或向下。

要将字符串转换为int(请注意单词Convert not cast),您可以使用:

Convert.ToInt32(strObject.ToString());

我希望这有助于澄清。当然,在执行转换之前,您可能需要检查对象是否为空。