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