简体   繁体   中英

How to bind data from database to TreeView

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM