|
Тема
|
TreeView
|
|
Автор |
AiSiktiriks ([otkacham]) |
Публикувано | 31.10.04 08:42 |
|
Имам таблица Element в БД с полета:
ElementPK (Primary key - id)
Name (string)
ParentFK (Foreign key към същата таблица)
Искам да я заредя във TreeView control т.е всеки ред си има Име и Foreign key, който указва кой му е родителя.
Въпроса е че имам над 30000 Nodes който трябва да заредя - т.е трябва ми доста бърз алгоритъм.
Ще съм благодарен за идеи!
| |
Тема
|
Re: TreeView
[re: AiSiktiriks]
|
|
Автор | Гypy (Нерегистриран) |
Публикувано | 31.10.04 12:32 |
|
При 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();
}
}
| |
|
Прав си че наистина BeforeExpand event-a е най логичният начин особено като ме известиха че контролът ще има над 300к nodes ;)
10x за вниманието!
| |
|
|
|
|