当前位置: 代码迷 >> C# >> winfrom里TreeView如何剔除重复值啊
  详细解决方案

winfrom里TreeView如何剔除重复值啊

热度:303   发布时间:2016-05-05 02:51:04.0
winfrom里TreeView怎么剔除重复值啊?
 如题winfrom里TreeView怎么剔除重复值,我的代码在下面怎么在我的基础上改阿,我是新手,回答的时候请写上在哪加入语句,万分谢谢!!

用户A(这项不能重复)
          角色A(从数据库中拿,有几个拿几个,这项在一个“用户”内不能重复)
                权限A(这项在一个“角色”内不能重复)
                权限B
      角色B(从数据库中拿,有几个拿几个)
      ......
用户B
          角色A
          ......
麻烦各位写出代码小弟初学  走过路过看两眼,谢谢~~


private void Form2_Load(object sender, EventArgs e)
        {
            string username = value2;

            treeView1.ShowLines = true;
            SqlConnection con = new SqlConnection("server=Sofia;uid='" + username + "';pwd='" + username + "';database=renvecf");
            con.Open();
            SqlCommand com = new SqlCommand("select * from T_emp_view", con);
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = com;
            DataSet ds = new DataSet();
            da.Fill(ds, "T_emp_view");

            //将数据绑定到dataGridView控件上
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "T_emp_view";

            SqlDataReader dr = com.ExecuteReader();
            TreeNode newNode1 = treeView1.Nodes.Add("A", "用户信息", 1, 2);//一级节点
            while (dr.Read())
            {

                TreeNode newNode12 = new TreeNode("用户名" + dr[1].ToString(), 3, 4);// 二级节点              
                //3表示没有单击节点时显示的图标索引值,
                newNode12.Nodes.Add("A", "用户角色:" + dr[6].ToString(), 5, 6);
                newNode12.Nodes.Add("B", "用户角色:" + dr[6].ToString(), 7, 8);
                newNode12.Nodes.Add("C", "用户角色:" + dr[6].ToString(), 9, 10);
                newNode1.Nodes.Add(newNode12);
            }
            dr.Close();
            con.Close();
            treeView1.ExpandAll();
        }



------解决思路----------------------
既然是从数据库中查询  在查询显示之前  去掉 重复。关键字:Distinct
http://www.cnblogs.com/rainman/archive/2013/05/03/3058451.html
------解决思路----------------------
你这个怎么看都看不懂……
你先通过DataSet去拿到了select * from T_emp_view的查询结果,并进行绑定,然后却又执行了ExecuteReader方法来一个个读,既然已经有了DataSet,那后面根本没必要执行ExecuteReader,直接循环ds.Tables["T_emp_view"]就可以了

然后后面你的用户怎么对应角色,然后角色怎么对应权限,你就这个查询结果,谁能知道……

这里假定你的view查出了所有的新,包括有多少用户,对应字段为UserName,然后角色对应字段为RoleName,最后权限对应字段为AuthorityName,那TreeNode代码就应该是类似下面的
DataSet ds = new DataSet();
DataTable dt = ds.Tables["T_emp_view"];
TreeNode root = new TreeNode();//这里就对应你的Tree
var query = from r in dt.AsEnumerable()
            group r by r.Field<string>("UserName") into g
            select g;
foreach (var g in query)
{
    TreeNode nameNode = new TreeNode();
    nameNode.Text = g.Key;//用户姓名
    root.Nodes.Add(nameNode);
    var roleQuery = g.GroupBy(x => x.Field<string>("RoleName"));
    foreach(var r in roleQuery)
    {
        TreeNode roleNode = new TreeNode();
        roleNode.Text = r.Key;//角色名称
        nameNode.Nodes.Add(roleNode);
        foreach (var a in r)
        {
            TreeNode authNode = new TreeNode();//权限名称
            authNode.Text = a.Field<string>("AuthorityName");
            roleNode.Nodes.Add(authNode);
        }
    }
}

------解决思路----------------------
我给的已经是完整版了啊……
用到了泛型,Linq,然后你这个迭代都不需要,因为看你视图查询出来的已经是全的数据了(猜的)
------解决思路----------------------
从数据源  剔除
  相关解决方案