как использовать идентификатор иерархии в c# windows форме приложения - PullRequest
1 голос
/ 20 апреля 2020

я создаю простую таблицу, такую ​​как изображение ниже

enter image description here

и заполняю элементом, например изображением ниже

enter image description here

загрузить эту таблицу в виде дерева в приложении формы c#, используя microsoft.sqlserver.types.10.50.1600.1 nuget и рабочий фин

enter image description here

моя проблема в том, что я не знаю как преобразовать древовидное представление в иерархию в c#. Я ищу по inte rnet, но все описание для иерархии в sql -сервер. я использую древовидный путь, но эту возвращаемую строку, например: возвращение узла ремонтника автомобиля: менеджер / NT / NT & Эксперт по транспортировке / ремонтник автомобиля, но я хочу, чтобы возвращение / 1/1/2 / сохранялось в моей таблице, и вторая проблема - как пройти все поздние узлы для обновления таблицы при вставке или удалении. мой код для загрузки данных в древовидную структуру:

namespace TVHierachyID
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        DataTable dataTable4;
        private BindingSource oBS = new BindingSource();
        private void btnGetData_Click(object sender, EventArgs e)
        {
            SqlConnection cs4 = new SqlConnection("Data Source=1.1.1.1;Network Library=DBMSSOCN;Initial Catalog=test;User ID=test;Password=test");
            SqlDataAdapter adapter4 = new SqlDataAdapter("select unit_name,lvl,lvl.ToString()as lvls,lvl.GetLevel()as lvln from test_tbl", cs4);
             dataTable4 = new DataTable();
            adapter4.Fill(dataTable4);            
            oBS.DataSource = dataTable4;
            dgData.DataSource = oBS;
            lblCount.Text = string.Format("{0} records loaded", oBS.Count);
        }
        private void doTV_Click(object sender, EventArgs e)
        {
            string sKeyField = "lvl", sTextField = "lvls";
            LoadTreeSQLHierarchy(this.tvData, dataTable4,sKeyField,sTextField);
        }
        /// <summary>
        /// Uses Linq to filter the table
        /// additional info from: http://nesteruk.org/blog/post/Working-with-SQL-Server-hierarchical-data-and-Silverlight.aspx#Reference6
        /// </summary>
        /// <param name="oTV">Treeview to load</param>
        /// <param name="oTable">datatable with the nodekey</param>
        private void LoadTreeSQLHierarchy(TreeView oTV, DataTable oTable, string sKeyField, string sTextField)
        {
            oTV.Nodes.Clear();
            TreeNode oNode;
            SqlHierarchyId iID = new SqlHierarchyId();
            EnumerableRowCollection<DataRow> query = from TNodes in oTable.AsEnumerable()                                                                                            where TNodes.Field<SqlHierarchyId>(sKeyField).GetAncestor(1).Equals(iID)
                                                     select TNodes;

            DataView oDV = query.AsDataView();
            if (oDV.Count == 1)
            {               
                oNode = new TreeNode(oDV[0][0].ToString());
                oNode.Tag = oDV[0].Row;
                LoadNodeSQLHierarchy(oNode, oTable);
                oTV.Nodes.Add(oNode);
            }
        }
        /// <summary>
        /// Load up the children 
        /// </summary>
        /// <param name="oParent">parent node</param>
        /// <param name="oTable">datatable with the nodekey</param>
        private void LoadNodeSQLHierarchy(TreeNode oParent, DataTable oTable)
        {
            oParent.Nodes.Clear();
            SqlHierarchyId iID = new SqlHierarchyId();
            DataRow oRow = (DataRow)oParent.Tag;
            iID = (SqlHierarchyId)oRow["lvl"];
            EnumerableRowCollection<DataRow> query = from order in oTable.AsEnumerable()
                                                     where order.Field<SqlHierarchyId>("lvl").GetAncestor(1).Equals(iID)
                                                     select order;
            DataView oDV = query.AsDataView();
            foreach (DataRowView oDR in oDV)
            {
                TreeNode oNode = new TreeNode(oDR["unit_name"].ToString());
                oNode.Tag = oDR.Row;
                LoadNodeSQLHierarchy(oNode, oTable);
                oParent.Nodes.Add(oNode);
            }
        }       
    }
}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Это может быть немного чище:

public IEnumerable<TreeNode> GetTreeNodeParentPath(TreeNode oParentNode)
{
    if (oParentNode != null)
    {
        yield return oParentNode;
        foreach (var node in GetTreeNodeParentPath(oParentNode.Parent))
            yield return node;
    }
}

public void PrintNodesRecursive(TreeNode oParentNode)
{
    foreach (TreeNode oSubNode in oParentNode.Nodes)
    {
        var message = String.Concat(GetTreeNodeParentPath(oSubNode).Select(x => $"{x.Index}/"));
        MessageBox.Show((message), oSubNode.Text);
        PrintNodesRecursive(oSubNode);
    }
}
0 голосов
/ 24 апреля 2020

решено этим Возможно другие будут использовать это: X

private void buttonsave_Click(object sender, EventArgs e)
    {
        TreeNode oMainNode = tvData.Nodes[0];
        PrintNodesRecursive(oMainNode);
        fsave = true;
    }

 public void PrintNodesRecursive(TreeNode oParentNode)
    {
        // Start recursion on all subnodes.
        foreach (TreeNode oSubNode in oParentNode.Nodes)
        {
            TreeNode node = oSubNode;
            while (node != null)
            {
                path2.Push(node.Index.ToString());
                node = node.Parent;
            }
            string nodePath = string.Join("/", path2.ToArray()) + "/";
            nodePath = nodePath.Remove(0, 1);
            MessageBox.Show(nodePath, oSubNode.Text);
            path2.Clear();
            PrintNodesRecursive(oSubNode);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...