Jeżeli istnieje konieczność utworzenia drzewa na podstawie różnych danych, czasem konieczne okazuje się “ręczne” utworzenie drzewa za pomocą kontrolki ASPxTreeList. Niezbędne określenie jest wartości właściwości ParentFieldName. Właściwość ta wskazuje na pole będące wskazaniem na obiekt nadrzędny węzła (TreeListNode). Przykładowy kod wygląda następująco:
<dxwtl:ASPxTreeList ID="tlIndexes" runat="server" Width="100%" ParentFieldName="ParentID">
</dxwtl:ASPxTreeList>
Teraz zdefiniujmy metodę, która doda wiersz w naszym drzewie:
private TreeListNode AppendNode(object key, string text, string number,
string date, TreeListNode parent)
{
TreeListNode node = tlIndexes.AppendNode(key, parent);
node["Name"] = text;
if (parent != null)
{
node["ParentID"] = parent.Key;
node["IconName"] = "legalActIcon";
}
else
{
node["IconName"] = "middleIndexIcon";
}
node["Number"] = number;
node["Date"] = date;
return node;
}
Kluczowym fragmentem jest utworzenie nowego węzła za pomocą metody AppendNode. Dodatkowo konieczne jest dodanie wskazania na pole definiujące indeks nadrzędnego elementu (node["ParentID"] = parent.Key;).
Dodajmy za pomocą tej metody węzły naszego drzewa. Dla przykładu niech będą to obiekty klas XPO. Przekazany do metody obiekt jest (Journal j) instancją klasy Journal.
private void BuildTreeList(Journal j)
{
int index = 1;
foreach (MiddleIndexOrder mi in j.MiddleIdexOrdersSorted)
{
TreeListNode n = AppendNode(index, "", mi.MiddleIndexName, "", null);
index++;
IEnumerable<LegalAct> l = j.GetLegalActByMiddleIndex(mi);
foreach (LegalAct a in l)
{
AppendNode(index, a.Title, "poz. " + a.PositionInDiary.ToString(),
a.ActDate.ToShortDateString(), n);
index++;
}
}
}
Docelowy kod kontroli ASPxTreeList wygląda następująco:
<dxwtl:ASPxTreeList ID="tlIndexes" runat="server" Width="100%" ParentFieldName="ParentID">
<Styles>
<AlternatingNode Enabled="True">
</AlternatingNode>
</Styles>
<SettingsBehavior AllowFocusedNode="True" AllowDragDrop="true" AutoExpandAllNodes="true" />
<SettingsEditing AllowNodeDragDrop="true" />
<Columns>
<dxwtl:TreeListTextColumn FieldName="Number" Caption="Nr w dzienniku">
<PropertiesTextEdit EncodeHtml="false" />
<CellStyle VerticalAlign="Top" Font-Bold="true" />
<DataCellTemplate>
<table>
<tr>
<td style="width: 16px">
<dxe:ASPxImage ID="ASPxImage1" runat="server"
ImageUrl='<%# GetIconUrl(Container) %>'
Width="16" Height="16" IsPng="true" />
</td>
<td>
<%# Container.Text %>
</td>
</tr>
</table>
</DataCellTemplate>
</dxwtl:TreeListTextColumn>
<dxwtl:TreeListTextColumn FieldName="Date" Caption="Data aktu">
<PropertiesTextEdit EncodeHtml="false" />
<CellStyle VerticalAlign="Top" ForeColor="#325E91" />
</dxwtl:TreeListTextColumn>
<dxwtl:TreeListTextColumn FieldName="Name" Caption="Tytuł">
<CellStyle Wrap="True" VerticalAlign="Top" />
<PropertiesTextEdit EncodeHtml="false" Style-Wrap="True">
<Style Wrap="True">
</Style>
</PropertiesTextEdit>
</dxwtl:TreeListTextColumn>
<dxwtl:TreeListTextColumn FieldName="ParentID" Visible="false">
<PropertiesTextEdit EncodeHtml="false" />
<CellStyle VerticalAlign="Top" />
</dxwtl:TreeListTextColumn>
</Columns>
</dxwtl:ASPxTreeList>
protected string GetIconUrl(TreeListDataCellTemplateContainer container)
{
return string.Format("~/CSS/images/{0}.png", container.GetValue("IconName"));
}
Efekt działania powyższego kodu pokazuje poniższy obrazek.
