TreeView

2 отговора 102 прегледа
#1

TreeView

Имам таблица Element в БД с полета:

ElementPK (Primary key - id)
Name (string)
ParentFK (Foreign key към същата таблица)

Искам да я заредя във TreeView control т.е всеки ред си има Име и Foreign key, който указва кой му е родителя.

Въпроса е че имам над 30000 Nodes който трябва да заредя - т.е трябва ми доста бърз алгоритъм.

Ще съм благодарен за идеи!

Отговор
в отговор на AiSiktiriks #2

Re: TreeView

При 30,000 нода както и да ги мислиш най-добрия вариант е да прихванеш expand event-a на нода и да заредиш неговите child nodes в ивент хендлъра. Тоест почваш само с руут нодес, и при всеки клик на "+" зареждаш децата.

Иначе наведнъж най-бързият начин е с ДатаСет и релации вътре в него - става само с едно куери.

private void GenerateTreeView()
{
OleDbConnection dbCon = new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Examples/Programming/SqlBinding/tree.mdb"));
dbCon.Open();

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM Links", dbCon);
DataSet ds = new DataSet();
adapter.Fill(ds);

ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["id"], ds.Tables[0].Columns["parentId"]);

foreach(DataRow dbRow in ds.Tables[0].Rows)
{
if(dbRow.IsNull("parentId"))
{
RadTreeNode node = CreateNode(dbRow["Text"].ToString(), true);
RadTree1.AddNode(node);
RecursivelyPopulate(dbRow, node);
}
}
}

private void RecursivelyPopulate(DataRow dbRow, RadTreeNode node)
{
foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
{
RadTreeNode childNode = CreateNode(childRow["Text"].ToString(), true);
node.AddNode(childNode);
RecursivelyPopulate(childRow, childNode);
}
}

private RadTreeNode CreateNode(string text, bool expanded)
{
RadTreeNode node = new RadTreeNode(text);
node.Expanded = true;

return node;
}

private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
GenerateTreeView();
}
}

Отговор
в отговор на Гypy #3

Re: TreeView

Прав си че наистина BeforeExpand event-a е най логичният начин особено като ме известиха че контролът ще има над 300к nodes ;)
10x за вниманието!

Отговор