一个通用的绑定UltraWebTree树结构

来源:互联网 发布:后台cms内容管理系统 编辑:程序博客网 时间:2024/05/29 16:40

    UltraWebTree是Infragistics   NetAdvantage for .net第三方UI控件库中的树型控件,功能强大,对客户端支持很好.在程序开发中经常要用到树,用来分层过滤数据,现在写一个通用的方法,实现无现层的树结构.

 

一.定义一个树结点存储的对象,存放在节点DataKey属性中

 [Serializable()]
    public class tnodedata
    {
        public string str_data; //前台值
        public string filter_str;//过滤串 and 结构
        public string value_data;//后台值
        public string fieldname;
        public string levelcode;
        public int level; 
        public override string ToString()
        {
            return value_data;//方便在客户端得到此值
        }
    }

 

二.实现方法

  /// <summary>
  /// 实现把字符串,按分隔符,生成ArrayList 
  /// </summary>
  /// <param name="str"></param>
  /// <param name="sepa"></param>
  /// <returns></returns>
  public ArrayList split_local(string str, string sepa)
  {
   ArrayList temp_array;
   string temp_str;
   temp_array = new ArrayList();
   temp_str = str;
   while (temp_str.Length > 0)
   {
    if (temp_str.IndexOf(sepa) > 0)
    {
     temp_array.Add(temp_str.Substring(0, temp_str.IndexOf(sepa)).Trim());
    }
    else
    {
     temp_array.Add(temp_str.Trim());
     temp_str = "";
     goto exitWhileStatement0;
    }
    temp_str = temp_str.Substring(temp_str.IndexOf(sepa) + sepa.Length);
   }
   exitWhileStatement0: ;
   return temp_array;
  }

 

 

        /// <summary>
        /// 提供根据DataTable,绑定结构树
        /// </summary>
        /// <param name="tv">树控件ID</param>
        /// <param name="parent_node"> 父项目名称,没有时为null</param>
        /// <param name="field_lst">后台字段列表,用于控制(ID)</param>
        /// <param name="title_lst">前台字段列表,用于显示(TItle)</param>
        /// <param name="dtbl">DataTable,按order by 已排序</param>
        /// <param name="recursive_level">递归的层次数</param>
        public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level)
        {
            Get_Tree(tv, parent_node, field_lst, title_lst, dtbl, recursive_level, ",");
        }

        public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level, string sp_field)
        {
            Get_Tree(tv, parent_node, field_lst, title_lst, dtbl, recursive_level, sp_field, ",");
        }

        public void Get_Tree(UltraWebTree tv, Node parent_node, string field_lst, string title_lst, DataTable dtbl, int recursive_level, string sp_field, string sp_title)
        {
            ArrayList field_array;
            ArrayList title_array;
            field_array = split_local(field_lst, sp_field);
            title_array = split_local(title_lst, sp_title);
            this.Get_Tree(tv, parent_node, field_array, title_array, dtbl, recursive_level);
        }

        private bool Get_Tree(UltraWebTree tv, Node parent_node, ArrayList field_lst, ArrayList title_lst, DataTable dtbl, int recursive_level)
        {
            int i;
            int j;
            int k;
            int min_level;
            ArrayList old_key_lst;
            ArrayList old_data_lst;
            Node Node;
            Node node_new;
            tnodedata data;
            string field_name;
            string tmp_field;
            string disp_title;
            bool Get_Tree;
            Get_Tree = false;
            if (dtbl == null)
            {
                return Get_Tree;
            }
            try
            {

                min_level = System.Math.Min(recursive_level, dtbl.Columns.Count);
                old_data_lst = new ArrayList();
                old_key_lst = new ArrayList();
                for (i = 0; i <= min_level - 1; i++)
                {
                    old_data_lst.Add("----");
                    old_key_lst.Add("----");
                }
                for (i = 0; i < dtbl.Rows.Count; i++)
                {
                    for (j = 0; j <= min_level - 1; j++)
                    {
                        data = new tnodedata();
                        data.level = j;
                        tmp_field = title_lst[j].ToString();
                        field_name = field_lst[j].ToString();
                        disp_title = dtbl.Rows[i][tmp_field].ToString();
                        data.str_data = disp_title;
                        data.value_data = dtbl.Rows[i][field_name].ToString();
                        data.fieldname = field_name;
                        data.filter_str = data.fieldname + "='" + (data.value_data) + "'";
                        Node = new Node();
                        Node.Text = dtbl.Rows[i][tmp_field].ToString();
                        Node.ImageUrl = "../images/treeimage.gif";
                        Node.SelectedImageUrl = "../images/treeSelectedImag.gif";
                        Node.DataKey = data;
                        if (((string)(old_key_lst[j])) != dtbl.Rows[i][field_name].ToString())
                        {
                            if (j == 0)
                            {
                                if (parent_node == null)
                                {
                                    tv.Nodes.Add(Node);
                                }
                                else if (parent_node.DataKey != null)
                                {
                                    if (((tnodedata)(parent_node.DataKey)).filter_str != "")
                                    {
                                        data.filter_str = data.filter_str + " and " + ((tnodedata)(parent_node.DataKey)).filter_str;
                                        parent_node.Nodes.Add(Node);
                                    }
                                }
                            }
                            else
                            {
                                node_new = ((Node)(old_data_lst[j - 1]));
                                if (node_new != null)
                                {
                                    if (node_new.DataKey != null)
                                    {
                                        if (((tnodedata)(node_new.DataKey)).filter_str != "")
                                        {
                                            data.filter_str = data.filter_str + " and " + ((tnodedata)(node_new.DataKey)).filter_str;
                                        }
                                    }
                                    node_new.Nodes.Add(Node);
                                }
                            }
                            old_data_lst[j] = Node;
                            old_key_lst[j] = dtbl.Rows[i][field_name];
                            for (k = j + 1; k <= min_level - 1; k++)
                            {
                                old_data_lst[k] = "----";
                                old_key_lst[k] = "----";
                            }
                        }
                    }
                }

                old_data_lst.Clear();
            }
            catch (Exception es)
            {
                throw new Exception(es.Message);
            }

            return Get_Tree;
        }

 

三调用说明

treeShop:UltraWebTree ,//Infragistics.WebUI.UltraWebNavigator

dtbl:DataTable ,必须是按字段排序,因为处理过程是从表的第一行,依次处理,只有一层可以不排,就按表的自然顺序

lev1_mc,lev2_mc,lev3_mc:每一层的显示字段名称,lev1_mc:第一层的字段名称

lev1_id,lev2_id,lev3_id :每一层的控制字段名称,lev1_id第一层的字段名称

 

1)field_lst与title_lst取同的字段

  //字段顺序无关  

  string sqlstr = "select lev1_mc,lev2_mc,lev3_mc from table1 order by lev1_mc,lev2_mc,lev3_mc";
  DataTable dtbl = GetDataTable(sqlstr);
  Get_Tree(treeShop, null, "lev1_mc,lev2_mc,lev3_mc", "lev1_mc,lev2_mc,lev3_mc", dtbl, 3);

//支持字段合并,分组等复杂SQL语句

 //string sqlstr = "select lev1_mc,lev2_mc||lev3_mc as mc from table1 order by lev1_mc,lev2_mc,lev3_mc";
// Get_Tree(treeShop, null, "lev1_mc,mc", "lev1_mc,mc", dtbl, 2);

 

2)field_lst与title_lst取不同的字段

  string sqlstr = "select lev1_mc,lev2_mc,lev3_mc,lev1_id,lev2_id,lev3_id  from table1 order by lev1_mc,lev2_mc,lev3_mc";
  DataTable dtbl = GetDataTable(sqlstr);
  Get_Tree(treeShop, null, "lev1_id,lev2_id,lev3_id"lev1_mc,lev2_mc,lev3_mc", dtbl, 3);

  //Get_Tree(treeShop, treeShop.SelectedNode, "lev1_id,lev2_id,lev3_id"lev1_mc,lev2_mc,lev3_mc", dtbl, 3); //增加到当前选择的节点

 

四对树的操作

//treeShop的服务端事件

 protected void treeShop_NodeClicked(object sender, Infragistics.WebUI.UltraWebNavigator.WebTreeNodeEventArgs e)
    {

        //按字段结构组合的where 条件

        //根据选择树的层次的不同,filter_str不同

        //如:1层:    lev1_id= '1111' ;  2层:    lev1_id= '1111' and lev2_id='2222'  ;3层:    lev1_id= '1111' and lev2_id='2222'  and lev2_id='ffff'

        string fstStr = ((tnodedata)e.Node.DataKey).filter_str; 

       // BindGridData(fstStr);

 

        string lev2_id = ((tnodedata)e.Node.DataKey).value_data;//当前层不value值;
        BindGridData2(lev2_id );
    }

 

使用vs2003开发的,所以没有泛型,在Vs2003,2008中编译通过