从数据库创建树视图

本文关键字:视图 创建 数据库 | 更新日期: 2023-09-27 17:56:37

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


employe_id 名字

boss_id代码 XXX 中employee_id具有递归关系

我有代码,但有一些错误显示"指定的强制转换无效"。

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;
    }

从数据库创建树视图

试试这个

    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);
    }

为什么不在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

当您事先不知道对象类型时,您需要小心使用强制转换。请记住,强制转换仅在"是"关系中有效。对于其他所有内容,您需要进行转换。

例如:

如果你有

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(请注意单词 转换 不强制转换),您将使用:

Convert.ToInt32(strObject.ToString());

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

我唯一可以看到您收到此错误的地方是:

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

尝试执行以下操作:

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