我在C#做了一个treeview,用的是递归的方法,代码如下图
private void AddTree(int Pid, TreeNode PNode)
{
string sqlStr = "SELECT * FROM Resources";
DataTable dt = Yc_TestS.BaseClass.YSqlHelper.ExecuteQuery(sqlStr, CommandType.Text);
if (dt.Rows.Count > 0)
{
DataView dv = new DataView(dt);
//过滤ParentID,得到当前的所有子节点 ParentID为父节点ID
dv.RowFilter = "[parentID] = " + Pid;
//循环递归
foreach (DataRowView Row in dv)
{
//声明节点
TreeNode Node = new TreeNode();
//绑定超级链接
//Node.NavigateUrl = String.Format("javascript:show('{0}')", Row["name"].ToString());
//开始递归
if (PNode == null)
{
//添加根节点
Node.Text = Row["name"].ToString();
Node.Value = Row["id"].ToString();
TreeView1.Nodes.Add(Node);
Node.Expanded = true; //节点状态展开
AddTree(Int32.Parse(Row["id"].ToString()), Node); //再次递归
}
else
{
//添加当前节点的子节点
Node.Text = Row["name"].ToString();
Node.Value = Row["id"].ToString();
PNode.ChildNodes.Add(Node);
Node.Expanded = true; //节点状态展开
AddTree(Int32.Parse(Row["id"].ToString()), Node); //再次递归
}
}
}
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=BUAA-TORNADO;Initial Catalog=knowledgebase;Integrated Security=True";
conn.Open();
SqlDataAdapter ada = new SqlDataAdapter(" //怎么写SQL语句?", conn);
DataSet ds = new DataSet();
ada.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
其中Resources表如下图

里面的数据如下图

最后绑定到treeview中的结果如下图

想实现的功能是,在右侧放一个Griedview,点击相应的节点出来相应的表格
建立的统一存放机床表(Machine表)的属性如下图

统一存放刀具的表属性如下

现在的问题是,由于treeview‘机床’分类下和‘刀具’分类下的属性不同,没办法放在一张表中,所以要在SQL语句中进行判断,
如果treeview的value是4,5,6,7,……到23,则select * from Machine,
如果treeview的value是24,25……30,则select * from Tool,
这里面的SQL语句应该怎么写?或者说我应该从哪里进行判断?
------解决思路----------------------
添加节点的同时把(id,a)的对应关系存放在一个字典里,点击节点的时候不就可以用id取a了。
------解决思路----------------------
首先读取数据时候把id和标识字段都读过来,找个合适方式存放就可以了,
大不了每次点击后,去遍历一次DataView得到标识字段,