我有 treeNode 查看代码如何将其转换为递归函数

I have treeNode view Code How To convert it for Recursive Function

我有一个运行良好的代码,正在努力增加它的功能并制作一个我认为使用递归函数会很棒的代码我有树视图节点 当我试图使它成为递归函数时的代码它不显示它将显示一个空框这是我的正常代码

 public   string ParentNode_Query = @"Select COMPONENT_NAME 
                                               from Table 
                                               where PARENT_NAME is null";

    public  string Rest_of__Node_Query = @"Select COMPONENT_NAME 
                                               from Table
                                               where 
                                               PARENT_NAME=@Parentname";

       public Task Populate_Tree_View(TreeView treeView)
    {
        try
        {
            SqlCommand new1 = new SqlCommand(@"select COMPONENT_NAME from bom", Connection);
            var data = Table.dataTable_Create_Method(new1);
            while (true) {
                SqlCommand = new SqlCommand(Database_Query.ParentNode_Query, Connection);
                var data_Parent = Table.dataTable_Create_Method(SqlCommand);

                foreach (DataRow frist in data_Parent.Rows)
                {
                    Parent_Node = new TreeNode(frist["COMPONENT_NAME"].ToString());
                    SqlCommand = new SqlCommand(Database_Query.Rest_of__Node_Query, Connection);
                    SqlCommand.Parameters.AddWithValue("@Parentname", frist["COMPONENT_NAME"].ToString());
                    // These Variable are created  purpose are for clean and readble code
                    var data_Second_Node = Table.dataTable_Create_Method(SqlCommand);
                    foreach (DataRow second in data_Second_Node.Rows)
                    {
                        Second_Node = new TreeNode(second["COMPONENT_NAME"].ToString());
                        Parent_Node.Nodes.Add(Second_Node);
                        SqlCommand = new SqlCommand(Database_Query.Rest_of__Node_Query, Connection);
                        SqlCommand.Parameters.AddWithValue("@Parentname", second["COMPONENT_NAME"].ToString());
                        var data_Third_Node = Table.dataTable_Create_Method(SqlCommand);

                        foreach (DataRow third in data_Third_Node.Rows)
                        {
                            Third_Node = new TreeNode(third["COMPONENT_NAME"].ToString());
                            Second_Node.Nodes.Add(Third_Node);
                            SqlCommand = new SqlCommand(Database_Query.Rest_of__Node_Query, Connection);
                            SqlCommand.Parameters.AddWithValue("@Parentname", third["COMPONENT_NAME"].ToString());
                            var data_Fourth_Node = Table.dataTable_Create_Method(SqlCommand);
                            foreach (DataRow fourth in data_Fourth_Node.Rows)
                            {
                                Fourth_Node = new TreeNode(fourth["COMPONENT_NAME"].ToString());
                                Third_Node.Nodes.Add(Fourth_Node);
                                SqlCommand = new SqlCommand(Database_Query.Rest_of__Node_Query, Connection);
                                SqlCommand.Parameters.AddWithValue("@Parentname", fourth["COMPONENT_NAME"].ToString());
                                var data_Fifth_Node = Table.dataTable_Create_Method(SqlCommand);
                                foreach (DataRow five in data_Fifth_Node.Rows)
                                {
                                    Fifth_Node = new TreeNode(five["COMPONENT_NAME"].ToString());
                                    Fourth_Node.Nodes.Add(Fifth_Node);
                                }
                            }
                        }
                    }
                }
                treeView.Nodes.Add(Parent_Node); }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        return Task.CompletedTask; 
    }


public class DataTableCreation
{
    private SqlDataAdapter sqlDataAdapter;
    // use this method to Create a Datatable and fill it with data
    public DataTable dataTable_Create_Method(SqlCommand sqlCommand)
    {
        sqlDataAdapter = new SqlDataAdapter(sqlCommand);
        DataTable dataTable = new DataTable();
        sqlDataAdapter.Fill(dataTable);
        return dataTable;
    }

}

如您所见,类似的方法在所有地方都在重复以减少这种情况,我认为递归是好的。但我尝试了与互联网不同的方式,但我不起作用。另一个问题是 table 不包含任何 Id 字段,所以我必须使用组件名称过滤它们,如果我也更改数据库,我也需要使用此功能。这是否可以递归地做,所以如何做到这一点

类似这样的东西,但您需要 运行 它并调试它。

public  Task Populate_Tree_View(TreeView treeView)
{
    try
    {
        SqlCommand new1 = new SqlCommand(@"select COMPONENT_NAME from bom", Connection);
        var data = Table.dataTable_Create_Method(new1);

        var SqlCommand = new SqlCommand(Database_Query.ParentNode_Query, Connection);
        var data_Parent = Table.dataTable_Create_Method(SqlCommand);
        PopulateRows(treeView.Nodes, data_Parent); 

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, MediaTypeNames.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    return Task.CompletedTask;
}
public static void PopulateRows(TreeNodeCollection nodesCollection, DataTable rowsData)
{
    foreach (DataRow child in rowsData.Rows)
    {
        var thisNode = new TreeNode(child["COMPONENT_NAME"].ToString());
        nodesCollection.Add(thisNode);
        var sqlCommand = new SqlCommand(Database_Query.Rest_of__Node_Query, Connection);
        sqlCommand.Parameters.AddWithValue("@Parentname", child["COMPONENT_NAME"].ToString());
        var dataChildNode = Table.dataTable_Create_Method(sqlCommand);
        PopulateRows(thisNode.Nodes, dataChildNode);
    }
}