用于Web的TreeListView控件(多列的树形控件)
最近老是要用到显示多列的树型结构,而treeview只能显示单列,gridview又不能显示树型的结构,所以打算自己做个控件来解决这个问题,暂时取名叫:TreeListView。先说下我的思路,园内的朋友如果有更好的思路或想法,请反馈。
1.由于是多列,存在上下对齐问题,所以我用table呈现。
2.如何记录树形的结构关系?
给每行的tr加个属性 id 和childids ,id 是唯一的,childids记录他的子节点的id,多个id用“,”隔开。 (<tr id="1" depth="1" childids="2,3" >)
主要就这2点,具体怎么写就比较简单了,我就不说了,先上图
上面就是我的实现效果(下载演示)
现在只实现个显示功能,事件啥的都没实现,半成品都不到,所以没提供代码,你可以通过Reflector.exe查看或者留下你的mail。
如果让控件又好用有灵活,这个问题真是比较头痛,想来想去最后就做成这个样子了。
虽然只做了一点点,还是发出来了,希望各位提供反馈意见,以便下个版本做的更好。
---------------------------
如何使用:
后台:
Employee e1 = new Employee("Nancy", "Davalio");
Employee e2 = new Employee("Andrew", "Fuller");
Employee e3 = new Employee("Huang", "Hurry");
Employee e4 = new Employee("Jin", "Faster");
TreeListNode root = new TreeListNode();
root.Text = "root";
root.DataSource = e1;
TreeListNode node = new TreeListNode();
node.Text = "node1";
node.DataSource = e2;
TreeListNode node12 = new TreeListNode();
node12.Text = "node12";
node12.DataSource = e3;
TreeListNode node2 = new TreeListNode();
node2.Text = "node2";
node2.DataSource = e4;
node.ChildNodes.Add(node12);
root.ChildNodes.Add(node);
root.ChildNodes.Add(node2);
this.TreeListView1.DataSource = root;
this.TreeListView1.DataBind();
Employee e2 = new Employee("Andrew", "Fuller");
Employee e3 = new Employee("Huang", "Hurry");
Employee e4 = new Employee("Jin", "Faster");
TreeListNode root = new TreeListNode();
root.Text = "root";
root.DataSource = e1;
TreeListNode node = new TreeListNode();
node.Text = "node1";
node.DataSource = e2;
TreeListNode node12 = new TreeListNode();
node12.Text = "node12";
node12.DataSource = e3;
TreeListNode node2 = new TreeListNode();
node2.Text = "node2";
node2.DataSource = e4;
node.ChildNodes.Add(node12);
root.ChildNodes.Add(node);
root.ChildNodes.Add(node2);
this.TreeListView1.DataSource = root;
this.TreeListView1.DataBind();
页面部分:
<custom:TreeListView ID="TreeListView1" runat="server">
<HeaderTemplate>
<table width="500" border="0" cellpadding="0" cellspacing="1" bgcolor="#999999">
<tr height="30" bgcolor="#FFFFFF">
<td>ID</td>
<td width="120px">Text</td>
<td width="80px">FirstName</td>
<td width="80px">LastName</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr <%# ((TreeListNode)Container.DataItem).TreeTr%> bgcolor="#FFFFFF">
<td height="30"><%# ((TreeListNode)Container.DataItem).TreeImage%><%# ((TreeListNode)Container.DataItem).ID%></td>
<td><%# ((TreeListNode)Container.DataItem).Text%></td>
<td><%# ((Employee)((TreeListNode)Container.DataItem).DataSource).FirstName%></td>
<td><%# ((Employee)((TreeListNode)Container.DataItem).DataSource).LastName%></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</custom:TreeListView>
<HeaderTemplate>
<table width="500" border="0" cellpadding="0" cellspacing="1" bgcolor="#999999">
<tr height="30" bgcolor="#FFFFFF">
<td>ID</td>
<td width="120px">Text</td>
<td width="80px">FirstName</td>
<td width="80px">LastName</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr <%# ((TreeListNode)Container.DataItem).TreeTr%> bgcolor="#FFFFFF">
<td height="30"><%# ((TreeListNode)Container.DataItem).TreeImage%><%# ((TreeListNode)Container.DataItem).ID%></td>
<td><%# ((TreeListNode)Container.DataItem).Text%></td>
<td><%# ((Employee)((TreeListNode)Container.DataItem).DataSource).FirstName%></td>
<td><%# ((Employee)((TreeListNode)Container.DataItem).DataSource).LastName%></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</custom:TreeListView>