f:Tree

<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是可以设置的也可以实现修改当前节点的功能。

先写到这。

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值