我在生成treeview的时候,每生成一个节点都要通过id获得它的父节点。所以每次遍历开销太大,寻优化的方法

解决方案 »

  1.   

    在asp.net版里没人回复,转到c#里,各位为答复一下吧,up有分
      

  2.   

    这是我在Winform里写的一种解决办法,只要在数据中进行一次循环就可以生成全部树节点.
    private void Form1_Load(object sender, System.EventArgs e)
    {

    int PreIDLength=0;
    TreeNode PreNode=new TreeNode(); dataTable1.Rows.Add(new string[]{"0001","财务部"});
    dataTable1.Rows.Add(new string[]{"0002","工程部"});
    dataTable1.Rows.Add(new string[]{"00020001","开发1部"});
    dataTable1.Rows.Add(new string[]{"00020002","开发2部"});
    dataTable1.Rows.Add(new string[]{"000200010001","硬件组"});
    dataTable1.Rows.Add(new string[]{"00010001","会计"});
    dataTable1.Rows.Add(new string[]{"00010002","出纳"});
    dataTable1.Rows.Add(new string[]{"000100020001","出纳一"});
    dataTable1.Rows.Add(new string[]{"0001000200010001","出纳1"});
    dataTable1.Rows.Add(new string[]{"00010002000100010001","出纳a"});
    dataTable1.DefaultView.Sort="Column1";
    dataGrid1.DataSource=dataTable1;
    treeView1.Nodes.Add(PreNode);
    for(int i=0;i<dataTable1.Rows.Count;i++)
    {
    TreeNode trnAdd=new TreeNode();
    trnAdd.Text=dataTable1.DefaultView[i][1].ToString().Trim();
    trnAdd.Tag=dataTable1.DefaultView[i];
    int IDLength=dataTable1.DefaultView[i][0].ToString().Trim().Length;
    for(int j=0;j<=(PreIDLength-IDLength)/4;j++)
    {
    PreNode=PreNode.Parent;
    }
    PreNode.Nodes.Add(trnAdd);
    PreIDLength=dataTable1.DefaultView[i][0].ToString().Trim().Length;
    PreNode=trnAdd;
    }
    }要点:
    1.使用ID表示树的层次关系,因此对ID和数据有比较严格的要求;
    2.首先必须对数据按照ID排序,确定子节点紧跟着父节点.否则不能生成正确的树结构;
    3.使用两个变量保存上个节点的ID长度和上个节点,以对后续数据判断.这种方法还是有一点限制的,另外数据设计不大符合范式的要求.