我有一个名为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;
}
答案 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());
我希望这有助于澄清。当然,在执行转换之前,您可能需要检查对象是否为空。