#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, могут не соответствовать значениям в базе данных.