Дублировать неизменяемые строки TreeView для создания копии существующего TreeView

#c# #sql-server #treeview

#c# #sql-сервер #treeview

Вопрос:

привет лучшим моим настоящим друзьям. спасибо вам и моим любимым StackOverFlow.com

у меня есть элемент управления TreeView для просмотра некоторых иерархических данных. как вы знаете, в качестве источника данных для этого TreeVeiw используется базовый DataTable (основанный на таблице sql server).

моя проблема в том, как дублировать один корень и все его листья в качестве новой ветви моего TreeView.

дублировать узел TreeView, я думаю, довольно просто (с помощью метода TreeNode Clone()). но как насчет базового DataTable? как скопировать все строки дерева в одну таблицу? столбец ID — это identity, но как установить столбец ParentID на основе недавно вставленной родительской строки в таблице?

Заранее спасибо

Ответ №1:

Наиболее прямой подход заключается в использовании рекурсивного метода, который повторяет клонированные узлы дерева. Каждый узел найдет и обновит свою собственную запись в объекте DataTable. Вот базовый код WinForm, лежащий в основе:

 using System;
using System.Data;
using System.Windows.Forms;

namespace Demo {
    public class TestClass {
        DataTable table;

        public void Initialize() {
            table = new DataTable();
            table.Columns.Add("ID", typeof(int));
            table.Columns.Add("ParentID", typeof(int));
            table.Columns.Add("Text", typeof(String));
        }

        private void UpdateTreeData(TreeNode parentNode) {
            int parentId = Convert.ToInt32(parentNode.Tag);
            int childId;
            foreach (TreeNode n in parentNode.Nodes)
            {   // Assuming Tag contains the table ID value...
                childId = Convert.ToInt32(n.Tag);
                table.Select("ID = "   childId.ToString())[0]["ParentID"] = parentId;
                UpdateTreeData(n);
            }
        }
    }
}
}
  

Комментарии:

1. большое спасибо, Майк. ваше решение отлично работает, когда первичный ключ таблицы (ID) не является идентификатором или автономером. фактически, в этом сценарии мы не вставляем никакого значения в столбец ID, но оно заполняется после вставки записи. есть ли какой-либо способ сделать это? или я должен вместо этого неизбежно использовать столбец non identity?

2. Вы можете вставить произвольное значение в столбец ID. Когда DataTable обновляет базу данных (я предполагаю, SQL Server), база данных автоматически игнорирует любое значение в идентификаторе автоматического увеличения и вводит свое собственное значение. Следовательно, вы хотите синхронизировать свой объект DataTable со значениями фактического столбца идентификатора базы данных, прежде чем обновлять узлы дерева. В противном случае значения, которые вы вставили в DataTable, могут не соответствовать значениям в базе данных.