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