请高手指点如下两个问题:TreeView数据绑定和右键菜单
如题:1.例如有两张数据库表:①1(主键)AA2BB②a1(外键)aab1bbc2ccd2dd需要以表①的项目为第一级,表②对应的子项目为第二级,效果为:————AA||...
如题:
1. 例如有两张数据库表:
①1(主键) AA
2 BB
②a 1(外键) aa
b 1 bb
c 2 cc
d 2 dd
需要以表①的项目为第一级,表②对应的子项目为第二级,效果为:
————AA
| |_____aa
| |_____bb
————BB
|_____cc
|_____dd
请问该如何配置呢?
2. 在1问中的TreeView上添加右键菜单,能够对TreeView进行操作(添加删除改名称),并能分辨是父目录还是子目录
请高手赐教,如果能回答出两个问题追加100分!
四楼正解,只是在应用时出现一些小问题:你判断子母级的方法有缺陷,如果一个新建的母级node被选中,因为没有子级会被判断成子级;右键菜单“修改”后,会立即进行 tnPublic.BeginEdit()后面的操作,如果是对数据库update,虽然操作但数据不变化,如果再有tnPublic.BeginEdit(true)也会马上执行,甚至无法进行重命名。
第一个问题我解决了,第二个问题还没解决,分肯定是你的了,但是我希望能探讨一下上面的第二个bug 展开
1. 例如有两张数据库表:
①1(主键) AA
2 BB
②a 1(外键) aa
b 1 bb
c 2 cc
d 2 dd
需要以表①的项目为第一级,表②对应的子项目为第二级,效果为:
————AA
| |_____aa
| |_____bb
————BB
|_____cc
|_____dd
请问该如何配置呢?
2. 在1问中的TreeView上添加右键菜单,能够对TreeView进行操作(添加删除改名称),并能分辨是父目录还是子目录
请高手赐教,如果能回答出两个问题追加100分!
四楼正解,只是在应用时出现一些小问题:你判断子母级的方法有缺陷,如果一个新建的母级node被选中,因为没有子级会被判断成子级;右键菜单“修改”后,会立即进行 tnPublic.BeginEdit()后面的操作,如果是对数据库update,虽然操作但数据不变化,如果再有tnPublic.BeginEdit(true)也会马上执行,甚至无法进行重命名。
第一个问题我解决了,第二个问题还没解决,分肯定是你的了,但是我希望能探讨一下上面的第二个bug 展开
4个回答
展开全部
你好,补充的刚看到,第二个问题,其实如果你选中某个节点然后再点击下拉菜单上的增加(表示你想在选中的节点下面添加子节点),那么增加的节点就是(选中节点下面的)子节点尽管此时新增的节点没有子节点但是相对于整个树来说增加的节点是子节点,因为树的结构不仅仅是两级,如果想增加一个母节点,那么在树空白部分点击增加,那么此时增加的节点是母节点且是根节点以下代码我更新过了,并且测试了,除了插入数据库部分我没做,其他都可以实现,希望你看下我的注释部分,那部分注释是描述在界面上操作完之后对数据库的操作需,有问题可以再问!!注意的地方.
你把我贴给你的代码中的数据库换成你自己所需要的,表名也是,我用的实例表结构如下:
ID Name ParentID
其实你要实现的一效果用一张表就可以完成,添加一个父亲字段即可,这样,写出来的程序,不管有多少级都能动态的表示出来,用到递归算法,详情看代码:
以下代码是在winform程序中写的
namespace TreeViewTest
{
public partial class Form1 : Form
{
TreeNode tnPublic;
string newText = "";
public Form1()
{
InitializeComponent();
BindTreeView();
}
/// <summary>
/// 绑定数据库
/// </summary>
protected void BindTreeView()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=localhost;database=TuShuManage;uid=sa;pwd=sa";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * From Type where ParentID=0";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new System.Data.DataSet();
da.Fill(ds, "aa");
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode tr = new TreeNode();
tr.Text = ds.Tables[0].Rows[i]["Name"].ToString();
tr.Tag = int.Parse(ds.Tables[0].Rows[i]["ID"].ToString());
this.treeView1.Nodes.Add(tr);
getChildNodes(int.Parse(ds.Tables[0].Rows[i]["ID"].ToString()), tr, ref treeView1);
}
}
}
protected void getChildNodes(int parentID, TreeNode tr, ref TreeView tv)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=localhost;database=TuShuManage;uid=sa;pwd=sa";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * From Type where ParentID=" + parentID + "";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new System.Data.DataSet();
da.Fill(ds, "aa");
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode trr = new TreeNode();
trr.Text = ds.Tables[0].Rows[i]["Name"].ToString();
trr.Tag = int.Parse(ds.Tables[0].Rows[i]["ID"].ToString());
tr.Nodes.Add(trr);
getChildNodes(int.Parse(ds.Tables[0].Rows[i]["ID"].ToString()), trr, ref tv);
}
}
}
private void treeView1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
//判断是否点击了右键,如果点击了右键则进行相应程序的处理
this.treeView1.ContextMenuStrip = this.contextMenuStrip1; //出现右键菜单
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
tnPublic = e.Node;
e.Node.ExpandAll();
//this.treeView1.SelectedNode = null;
}
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//如何判断是父级还是子级
if (tnPublic.Tag != null && tnPublic.Tag.ToString() != "")
{
if (tnPublic.Nodes.Count == 0 && int.Parse(tnPublic.Tag.ToString()) != 0)
{
//是子级
if (e.ClickedItem.Text == "添加")
{
TreeNode tn = new TreeNode();
tn.Text = "新建节点";
tnPublic.Nodes.Add(tn);
tnPublic.ExpandAll();
this.treeView1.LabelEdit = true;
tn.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上添加完之后,需要在数据库里插入一条记录
//这边写插入数据库的代码
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "删除")
{
int id = int.Parse(tnPublic.Tag.ToString());//保存选中节点的ID,以便用来删除数据库中的记录
TreeNode tn = tnPublic.Parent;
tn.Nodes.Remove(tnPublic);
//在treeview中删除了节点之后,并没有删除数据库中的相应数据,那么在删除完了之后,还需要对数据库里相应的数据进行删除
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "修改")
{
this.treeView1.LabelEdit = true;
tnPublic.ExpandAll();
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上修改完之后,需要对数据库进行相应的更改
//数据库里的数据插入完之后
//数据库提交完之后再执行BindTreeView();方法
}
}
else
{
//是父级
if (e.ClickedItem.Text == "添加")
{
TreeNode tn = new TreeNode();
tn.Text = "新建节点";
tnPublic.Nodes.Add(tn);
tnPublic.ExpandAll();
this.treeView1.LabelEdit = true;
tn.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上添加完之后,需要在数据库里插入一条记录
//这边写插入数据库的代码
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "删除")
{
int id = int.Parse(tnPublic.Tag.ToString());//保存选中节点的ID,以便用来删除数据库中的记录
TreeNode tn = tnPublic.Parent;
tn.Nodes.Remove(tnPublic);
//在treeview中删除了节点之后,并没有删除数据库中的相应数据,那么在删除完了之后,还需要对数据库里相应的数据进行删除
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "修改")
{
this.treeView1.LabelEdit = true;
tnPublic.ExpandAll();
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上修改完之后,需要对数据库进行相应的更改
//数据库里的数据插入完之后
//数据库提交完之后再执行BindTreeView();方法
}
}
tnPublic = new TreeNode();
}
else
{
tnPublic = new TreeNode();
tnPublic.Tag = "0";
tnPublic.Text = "新建节点";
this.treeView1.Nodes.Add(tnPublic);
this.treeView1.LabelEdit = true;
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//数据库提交完之后再执行BindTreeView();方法
}
}
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
}
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
newText = e.Label;//这里是添加节点或者修改节点时候保存的节点的新值用来保存到数据库里的
}
}
}
你把我贴给你的代码中的数据库换成你自己所需要的,表名也是,我用的实例表结构如下:
ID Name ParentID
其实你要实现的一效果用一张表就可以完成,添加一个父亲字段即可,这样,写出来的程序,不管有多少级都能动态的表示出来,用到递归算法,详情看代码:
以下代码是在winform程序中写的
namespace TreeViewTest
{
public partial class Form1 : Form
{
TreeNode tnPublic;
string newText = "";
public Form1()
{
InitializeComponent();
BindTreeView();
}
/// <summary>
/// 绑定数据库
/// </summary>
protected void BindTreeView()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=localhost;database=TuShuManage;uid=sa;pwd=sa";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * From Type where ParentID=0";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new System.Data.DataSet();
da.Fill(ds, "aa");
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode tr = new TreeNode();
tr.Text = ds.Tables[0].Rows[i]["Name"].ToString();
tr.Tag = int.Parse(ds.Tables[0].Rows[i]["ID"].ToString());
this.treeView1.Nodes.Add(tr);
getChildNodes(int.Parse(ds.Tables[0].Rows[i]["ID"].ToString()), tr, ref treeView1);
}
}
}
protected void getChildNodes(int parentID, TreeNode tr, ref TreeView tv)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=localhost;database=TuShuManage;uid=sa;pwd=sa";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * From Type where ParentID=" + parentID + "";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new System.Data.DataSet();
da.Fill(ds, "aa");
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode trr = new TreeNode();
trr.Text = ds.Tables[0].Rows[i]["Name"].ToString();
trr.Tag = int.Parse(ds.Tables[0].Rows[i]["ID"].ToString());
tr.Nodes.Add(trr);
getChildNodes(int.Parse(ds.Tables[0].Rows[i]["ID"].ToString()), trr, ref tv);
}
}
}
private void treeView1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
//判断是否点击了右键,如果点击了右键则进行相应程序的处理
this.treeView1.ContextMenuStrip = this.contextMenuStrip1; //出现右键菜单
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
tnPublic = e.Node;
e.Node.ExpandAll();
//this.treeView1.SelectedNode = null;
}
private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//如何判断是父级还是子级
if (tnPublic.Tag != null && tnPublic.Tag.ToString() != "")
{
if (tnPublic.Nodes.Count == 0 && int.Parse(tnPublic.Tag.ToString()) != 0)
{
//是子级
if (e.ClickedItem.Text == "添加")
{
TreeNode tn = new TreeNode();
tn.Text = "新建节点";
tnPublic.Nodes.Add(tn);
tnPublic.ExpandAll();
this.treeView1.LabelEdit = true;
tn.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上添加完之后,需要在数据库里插入一条记录
//这边写插入数据库的代码
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "删除")
{
int id = int.Parse(tnPublic.Tag.ToString());//保存选中节点的ID,以便用来删除数据库中的记录
TreeNode tn = tnPublic.Parent;
tn.Nodes.Remove(tnPublic);
//在treeview中删除了节点之后,并没有删除数据库中的相应数据,那么在删除完了之后,还需要对数据库里相应的数据进行删除
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "修改")
{
this.treeView1.LabelEdit = true;
tnPublic.ExpandAll();
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上修改完之后,需要对数据库进行相应的更改
//数据库里的数据插入完之后
//数据库提交完之后再执行BindTreeView();方法
}
}
else
{
//是父级
if (e.ClickedItem.Text == "添加")
{
TreeNode tn = new TreeNode();
tn.Text = "新建节点";
tnPublic.Nodes.Add(tn);
tnPublic.ExpandAll();
this.treeView1.LabelEdit = true;
tn.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上添加完之后,需要在数据库里插入一条记录
//这边写插入数据库的代码
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "删除")
{
int id = int.Parse(tnPublic.Tag.ToString());//保存选中节点的ID,以便用来删除数据库中的记录
TreeNode tn = tnPublic.Parent;
tn.Nodes.Remove(tnPublic);
//在treeview中删除了节点之后,并没有删除数据库中的相应数据,那么在删除完了之后,还需要对数据库里相应的数据进行删除
//数据库提交完之后再执行BindTreeView();方法
}
if (e.ClickedItem.Text == "修改")
{
this.treeView1.LabelEdit = true;
tnPublic.ExpandAll();
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//界面上修改完之后,需要对数据库进行相应的更改
//数据库里的数据插入完之后
//数据库提交完之后再执行BindTreeView();方法
}
}
tnPublic = new TreeNode();
}
else
{
tnPublic = new TreeNode();
tnPublic.Tag = "0";
tnPublic.Text = "新建节点";
this.treeView1.Nodes.Add(tnPublic);
this.treeView1.LabelEdit = true;
tnPublic.BeginEdit();
//此时节点的新名称保存在newText变量中
//数据库提交完之后再执行BindTreeView();方法
}
}
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
}
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
newText = e.Label;//这里是添加节点或者修改节点时候保存的节点的新值用来保存到数据库里的
}
}
}
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问题一,我没看懂,
问题二倒是可以解决!可以Hi我!
问题二倒是可以解决!可以Hi我!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把数据库里读的值转成XML
绑定XML数据到TREEVIEW上
绑定XML数据到TREEVIEW上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询