最近在项目中用到了Dev 中 Treelist这个控件,它能做出相当复杂的树形结构,目前应用的只是很简单的功能,不过在使用的过程中还是遇到了不少小问题,在这里记录下来,作为备忘,也希望能帮到其它碰到同样问题的童鞋。
1.简单的层次结构
要在Treelist中展现层次节点,比如, 井场其子节点为区队, 区队的子节点为班组,但有的班组比较特别,直属井场而没有上级的去对班组,类似于特别行政区。每次新建井场、区队节点赋初值为null,然后将查到的结果比如Name在赋值给Node,每次加子节点时判断上级Node是否为null,若为null则其子节点为更上一级,例如区队节点不为null,则班组的子节点为区队,否则子节点为井场。以此类推。
TreeListNode groupNode = null; if (groupName.Trim() != string.Empty) { if (unitNode != null) groupNode = treeList.AppendNode(new object[] { groupName }, unitNode.Id); else if (crewNode != null) { groupNode = treeList.AppendNode(new object[] { groupName }, crewNode.Id); } else { groupNode = treeList.AppendNode(new object[] { groupName }, wellNode.Id); } groupNode.ImageIndex = groupNode.SelectImageIndex = 0; }
动态添加trelistnode用AppendNode方法,该方法8个重载,上述的treeList.AppendNode(new object[] { groupName }, crewNode.Id);object[]是treeNode的数据,或者说要显示的内容,crewNode.Id是其父节点参数。
2.用Treelist显示数据表,即没有层次感。类似于datagridview的功能,完全可以用GridControl实现,只是在项目中用到发现了写问题,特此记录。
首先,treeList的datasource似乎有些问题。
查看dt是没有问题的。一直没有找到问题的原因,知道问题的大侠请不吝赐教。
首先,要取消层次感,要将Treelist的rootvalue属性设为null,再直接用DataSource,否则就会看见只有一条记录,点击展开才能看见其它记录。或者在添加TreeNode时每条记录的父节点都设为-1.
在项目中每次查的字段可能不同,因此要动态加载列而不能直接在设计器中设定,就在加载Column的地方我栽了跟头。
private void SetTreeList(DataTable dt) { int columnCount = dt.Columns.Count; if (columnCount < 1) return; TreeListColumn[] columns = new TreeListColumn[columnCount]; treeLayerSearch.Columns.Capacity = columnCount;//设置treelist for (int cIndex = 0; cIndex < columnCount; cIndex++) { TreeListColumn column = new TreeListColumn(); column.FieldName = dt.Columns[cIndex].ColumnName; column.Name = column.Caption = dt.Columns[cIndex].ColumnName; column.Visible = true; column.VisibleIndex = cIndex; columns[cIndex] = column; } treeLayerSearch.Columns.AddRange(columns); int count = dt.Rows.Count; for (int index = 0; index < count; index++) { DataRow row = dt.Rows[index]; treeLayerSearch.AppendNode(row.ItemArray, index); } }
TreeListColumn的默认Visible是false。。。。。每次看明明滚动条变得很细了,双击定位东西也能定位,证明其实treeList确实有东西了,但就是一条记录也看不见!再一个因为是每次不知道列数,就算AddRange列之前执行 treeLayerSearch.Columns.Clear();再次查询的时候发现第一次查询的列还是残留在Treelist上,必须 treeLayerSearch.Columns.Capacity = columnCount;每次定义列空间。。。。有点类似与数组的Capacity 和count的关系。
2013-11-13 发现TreeList有保留字ID(Id、id),当查出的datatable含有ID列时直接用DataSource赋值会有异常,用上面添加Node的方法则显示不出,需要把关键字ID替换,而在GridControl中没有这个问题。