f:Tree

来源:互联网 发布:淘宝宝贝详情页怎么做 编辑:程序博客网 时间:2024/06/05 16:58
<f:Tree ID="Tree1" Width="400px" Height="450" ShowHeader="true" EnableCollapse="true"                    Title="树控件" runat="server" OnNodeCommand="AddressInfoTree_NodeCommand">                    </f:Tree>

第一个写的FineUI结构。

ID作为控件的名字可以在behind里面直接用来便是tree控件,ShowHeader显示FineUI自定义的表头,EnableCollapse 是否允许打开关闭, Title控件表头展示的文字,runat="server" 默认属性表示在服务器端运行的程序,ONNodeCommand这个是比价重要的属性当点击节点触发的方法(补充一下还有很多的点击事件,一般都是有On来开头的,我们可以按space键就能调出fineui的)在后台代码中实现对应的方法,这个方法要有自己固有的参数AddressInfoTree_NodeCommand(object sender, TreeCommandEventArgs e),否则会有重载均与委托不匹配错误的产生。合理的配置参数。

实现一下功能:

1.绑定数据源,tree的数据源是dataset是一种数据和数据关系的集合

treeTable = new DataTable();            DataColumn tColumn1 = new DataColumn("Id", typeof(string));            DataColumn tColumn2 = new DataColumn("Text", typeof(string));            DataColumn tColumn3 = new DataColumn("ParentId", typeof(string));            treeTable.Columns.Add(tColumn1);            treeTable.Columns.Add(tColumn2);            treeTable.Columns.Add(tColumn3);
建立一个数据库的表,定义了自己的表头id,文本,父id,之后是向表袁术中添加数据

DataRow row = treeTable.NewRow();            row[0] = rootId;            row[1] = "全部数据";            row[2] = DBNull.Value;            treeTable.Rows.Add(row);
根节点的定义一般是这样的,没有父节点
DataRow row = treeTable.NewRow();            row[0] = "id1";            row[1] = "数据1";            row[2] = "paraId1";            treeTable.Rows.Add(row);
再添加一些数据进去,这时候我们的表示没有什么关系的。现在我们要建立的树形关系

            treeDataSet = new DataSet();            treeDataSet.Tables.Add(treeTable);            //设置父子关系            treeDataSet.Relations.Add("TreeRelation", treeDataSet.Tables[0].Columns["Id"], treeDataSet.Tables[0].Columns["ParentId"]);
建立dataset对象,将表添加到dataset里面,为table的某两列添加父子关系,完成这一步后我们的table就有了树形的结构(一个table只能加入一个dataset,只能有一个关系管理的工具)

                    row.IsNull("paraId");//这是主节点特有的属性,没有父亲,不是关系带的                    row.GetParentRow();                    row.GetChildRows();
这时候我们就可以用表关系,建立树关系了:在线代码

 private void LoadTreeData()        {            foreach (DataRow row in treeDataSet.Tables[0].Rows)            {                if (row.IsNull("ParentId"))                {                    TreeNode node = new TreeNode();                     node.NodeID = row["Id"].ToString();                    node.Text = row["Text"].ToString();                    node.Expanded = true;                    //添加根节                    Tree1.Nodes.Add(node);                    //允许点击事件                    node.EnableClickEvent = true;                    //表中的行和其对应在书中的节点                    ResolveSubTree(row, node);                }            }        }        private void ResolveSubTree(DataRow dataRow, TreeNode treeNode)        {            DataRow[] rows = dataRow.GetChildRows("TreeRelation");            if (rows.Length > 0)            {                treeNode.Expanded = false;                foreach (DataRow row in rows)                {                    TreeNode node = new TreeNode();                    if (row["ParentId"].Equals(rootId))                     {                        //默认打开一级节点                        treeNode.Expanded = true;                    }                    node.NodeID = row["Id"].ToString();                    node.Text = row["Text"].ToString();                    //允许点击事件                    node.EnableClickEvent = true;                    treeNode.Nodes.Add(node);                    ResolveSubTree(row, node);                }            }        }
这一段我几乎没改,就是先找到根节点,设置根节点,然后在递归添加所有的孩子节点

到目前为止我们的数据准备工作就做好了,运行之后就能有一个树形的结构了

2.还有一些比较重要操作

            //设置表的主键            treeDataSet.Tables[0].PrimaryKey = new DataColumn[] { treeDataSet.Tables[0].Columns["Id"] };
            DataRow row = treeTable.Rows.Find(nodeId);
为表结构设置主键,这里是在dataset里面弄得,单独拿表来弄也是好的。

然后根据主键查找就可以找到我们想要的表数据了,这里的find的有很多的重载方法,功能远比这个要强大。

            TreeNode node = Tree1.FindNode(row[0].ToString());
在建立树关系的时候我们就将rowid赋值给了nodeId,这里也可以根据id值找到tree的节点了,Select方法可以实现更多的查找

这里说一下我在命名id时候做的事情,因为对这片代码的函数认识的不轻,于是就让id起了一些标记的作用

例如我有一个级层关系中国,河北,沧州,那么我命名的时候就会取名zhongguo_hebei_cangzhou这样我们可以通过id就知道他的树和表的父亲id(当然我们还有其他的方式获取,例如treeNode.ParentNode()也可以递归实现),他的一个好处是不用担心id重复(2个地方都有新华小区)

这里用到了一个汉字转拼音的dll,只需要引用dll,声明命名空间就可以用了

http://download.csdn.net/detail/u010673842/9722205

3.设置树的选中节点

selectedNode不行是只读属性,但是selectedNodeId是可以设置的也可以实现修改当前节点的功能。

先写到这。

























1 0
原创粉丝点击