加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

DevExpress中的TreeView的使用实例

(2012-11-22 17:43:27)
标签:

devexpress

treeview

实例

杂谈

在项目中需要构建具有三级结点的目录树,所以独自花了一番功夫研究了下,现整理如下:

实现的功能:


其中,各级结点都是从同一个数据表获取的,需要根据三个字段值进行判断并绑定

         ///
         /// 构建树结点
         ///
         /// 结点数据源
         private void initTreeView(DataSet ds)
         {
             DataTable dt = ds.Tables[0];
             int row = dt.Rows.Count;
             int First = -1, Second = -1, Third = -1;
             TreeNode tmp1 = new TreeNode(), tmp2 = new TreeNode();
             treeView1.Nodes.Clear();
 
             //构建TreeView
             for (int i = 0; i < row; i++)
             {
                 //构建第一节点
                 if (Convert.ToInt32(dt.Rows[i]["SysID"]) != First)
                 {
                     First = Convert.ToInt32(dt.Rows[i]["SysID"]);
                     treeView1.Nodes.Add(dt.Rows[i]["SysID"].ToString(), dt.Rows[i]["SName"].ToString());
 
                     tmp1 = treeView1.Nodes[treeView1.Nodes.Count - 1];
                     treeView1.SelectedNode = tmp1;     //选中这一结点,以便往下构建第二结点
                     treeView1.SelectedNode.Tag = 1;               //第一结点标识
                 }
 
                 //构建第二结点
                 if (Convert.ToInt32(dt.Rows[i]["RepType"]) != Second)
                 {
                     if (treeView1.SelectedNode.Nodes.Count > 1)
                     {
                         treeView1.SelectedNode = tmp1;
                     }
                     Second = Convert.ToInt32(dt.Rows[i]["RepType"]);
                     treeView1.SelectedNode.Nodes.Add(dt.Rows[i]["RepType"].ToString(), dt.Rows[i]["TypeName"].ToString());
                     tmp2 = treeView1.SelectedNode.Nodes[treeView1.SelectedNode.Nodes.Count - 1];
                     treeView1.SelectedNode = tmp2;      //选中这一结点,以便往下构建第三结点
                     treeView1.SelectedNode.Tag = 2;            //第二结点标识
                 }
 
                 //构建第三结点
                 if (Convert.ToInt32(dt.Rows[i]["RepID"]) != Third)
                 {
                     Third = Convert.ToInt32(dt.Rows[i]["RepID"]);
                     treeView1.SelectedNode.Nodes.Add(dt.Rows[i]["RepID"].ToString(), dt.Rows[i]["RepName"].ToString());
                     treeView1.SelectedNode.Nodes[Third.ToString()].Tag = 3;        //第三结点标识
                 }
             }
         }

构造完目录树外,还需要初始化树节点的选中状态
(是从另一数据表读取的)

         ///
         /// 初始化时选中结点
         ///
         private void CheckNodes()
         {
             int row = gridView1.FocusedRowHandle;
             int empid = Convert.ToInt32(ds.Tables[0].Rows[row]["EmpID"]);
             try
             {
                 //获取被选中的结点目录
                 DataSet CheckDs = RP.InitReportList(empid, FShopID);
                 ClearNodesState();    //此处是清除结点状态,即默认不选中(自定义)
 
                 //选中结点
                 for (int i = 0; i < CheckDs.Tables[0].Rows.Count; i++)
                 {
                     string key = CheckDs.Tables[0].Rows[i]["RepID"].ToString();
                     for (int fir = 0; fir < treeView1.Nodes.Count; fir++)
                     {
                         for (int sec = 0; sec < treeView1.Nodes[fir].Nodes.Count; sec++)
                         {
                             //如果存在结点,则选中
                             if (treeView1.Nodes[fir].Nodes[sec].Nodes.ContainsKey(key))
                             {
                                 int thr = treeView1.Nodes[fir].Nodes[sec].Nodes.IndexOfKey(key);
                                 treeView1.Nodes[fir].Nodes[sec].Nodes[thr].Checked = true;         //选中第三结点
                                 treeView1.Nodes[fir].Nodes[sec].Checked = true;                    //选中第二结点
                                 treeView1.Nodes[fir].Checked = true;                               //选中第一结点
                             }
                         }
                     }
                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show(this.FindForm(), ex.Message);
             }
         }

          ///
         /// 清除树节点选中状态
         ///
         private void ClearNodesState()
         {
             //第一结点
             for (int fir = 0; fir < treeView1.Nodes.Count; fir++)
             {
                 //第二结点
                 for (int sec = 0; sec < treeView1.Nodes[fir].Nodes.Count; sec++)
                 {
                     //第三结点
                     for (int thi = 0; thi < treeView1.Nodes[fir].Nodes[sec].Nodes.Count; thi++)
                     {
                         treeView1.Nodes[fir].Nodes[sec].Nodes[thi].Checked = false;
                     }
                     treeView1.Nodes[fir].Nodes[sec].Checked = false;
                 }
                 treeView1.Nodes[fir].Checked = false;
             }
         }

为实现结点的Checked更改触发事件,自定义了一个修改标志变量.该变量初始为不修改态,当鼠标点击树后即处于可修改状态,此时即可触发事件。

特别声明:此处设置变量的意义在于,使得结点状态更改的触发事件不受结点初始化时的影响,从而使程序不致混乱

        private UpdateState IsUpdate=UpdateState.No;        //定义修改状态变量
 
         ///
         /// 修改状态枚举类型
         ///
         private enum UpdateState
         {
             No = 0,
             yes = 1
         }

        ///
         /// 树节点选中状态更改事件
         ///
         ///
         ///
         private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
         {
 
             if (IsUpdate == UpdateState.yes)
             {
                 treeView1.SelectedNode = e.Node;
                 IsUpdate = UpdateState.No;
                 if (!UpdRep())
                 {
                     MessageBox.Show(this, "操作失败,请重新尝试");
                 }
                 else
                 {
                     CheckNodes();
                 }
             }
         }
 
         ///
         /// 树点击事件
         ///
         ///
         ///
         private void treeView1_Click(object sender, EventArgs e)
         {
             //启用报表查看权修改
             IsUpdate = UpdateState.yes;
         }

此外,其实Tag属性是很有作用的,可以将所有的信息打包成一个对象赋值给Tag,所以我们可以随心所欲的随意发挥

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有