My aim is simple. I have data in DataTable which contains say 5 tables. In my TreeView I have to bind the Table Names as Nodes and Column Names as the child of the particular Node(table Name). I am using C# Language in VS2015. I am using WAF Architecture.
Here is what I tried till now :
View:-
<TreeView x:Name="treeQueryBuilder" ItemsSource="{Binding dictTree.Keys}">
<TreeView.ItemTemplate >
<HierarchicalDataTemplate >
<TextBlock FontWeight="Bold" Text="{Binding }"/>
<HierarchicalDataTemplate.ItemTemplate >
<DataTemplate >
<TextBlock Text="{Binding}" Width="100"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
ViewModel:-
public Dictionary<string, List<string>> dictTree
{
get
{
if (_TreeNode == null)
_TreeNode = new Dictionary<string, List<string>>();
return _TreeNode;
}
set { SetProperty(ref _TreeNode, value); }
}
public List<string> ChildNodes
{
get
{
if (_ChildNodes == null)
_ChildNodes = new List<string>();
return _ChildNodes;
}
set { SetProperty(ref _ChildNodes, value); }
}
Controller:-
private void PopulateDBTables()
{
try
{
DBConnect.ConnectToOracleDB(false);
Table_Query = "SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='DataBase' ORDER BY TABLE_NAME";
Obj_QueryBuilderViewModel.dtgrdTableData = DBConnect.RetrieveFromTable(Table_Query);
foreach (DataRow TableName in Obj_QueryBuilderViewModel.dtgrdTableData.Rows)
{
Obj_QueryBuilderViewModel.ParentNode = new TreeNode(TableName[0].ToString());
Obj_QueryBuilderViewModel.dictTree.Add(Obj_QueryBuilderViewModel.ParentNode.Text, ADDCHILDNODES(TableName[0].ToString(),Obj_QueryBuilderViewModel.ParentNode));
}
}
catch (Exception EX)
{
App.DisplayMessage(EX.Message);
}
}
private List<string> ADDCHILDNODES(string Table_Name, TreeNode parentNode)
{
try
{
DBConnect.ConnectToOracleDB(false);
Column_Query = "select column_name from dba_tab_cols where owner='EDS' and table_name='" + Table_Name + "'order by column_name";
dt_Columns = DBConnect.RetrieveFromTable(Column_Query);
if (Obj_QueryBuilderViewModel.ChildNodes.Count > 0)
{
Obj_QueryBuilderViewModel.ChildNodes = null;
}
foreach (DataRow Column_Name in dt_Columns.Rows)
{
Obj_QueryBuilderViewModel.ChildNode = new TreeNode(Column_Name[0].ToString());
Obj_QueryBuilderViewModel.ChildNodes.Add(Obj_QueryBuilderViewModel.ChildNode.Text);
}
}
catch (Exception EX)
{
}
return Obj_QueryBuilderViewModel.ChildNodes;
}
Here Obj_QueryBuilderViewModel is the object of ViewModel.
While using the above code, I am able to bind only the parent nodes in treeview, but not the child elements.
At last,This is what i have found.
<TreeView x:Name="treeQueryBuilder" ItemsSource="{Binding DictClass}">
<TreeView.ItemTemplate >
<HierarchicalDataTemplate Itemsource="{Binding Columnnames}" >
<TextBlock FontWeight="Bold" Text="{Binding Tablenames }"/>
<HierarchicalDataTemplate.ItemTemplate >
<DataTemplate >
<TextBlock Text="{Binding}" Width="100"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
In which i have taken a Class and in that written the Properties for the Class
public Class DictClass
{
public string Tablenames{get;set;}//as Parentnodes
public list<string> Columnnames{get;set;}//as Childnodes
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.