none
dataview 绑定数据到treeview RRS feed

  • 问题

  • 我有一树形菜单是从库里获取递归绑定到treeview控件上的,具体是这样的,取出数据-》dataview->设置筛选rowfilter->递归绑定;

    很奇怪的是:在本地显示这个菜单是可以的,但服务器上却这样显示:

    There is no row at position 1.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.IndexOutOfRangeException: There is no row at position 1.

     

    这会是服务器的问题吗?恳请高手指点。

     


    cathy
    2010年8月27日 7:55

答案

  • 下面是我以前写的递归创建树的例子,希望对你有帮助!

    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Windows.Forms;
    
    namespace X.WinForms.UI.Controls.TreeViews
    {
      public partial class D001 : Form
      {
        public D001()
        {
          InitializeComponent();
    
          this.InitData(); // 初始数据
          this.BuildTreeView(this.dt, this.treeView1.Nodes, 0); // 递归创建树
        }
    
        private DataTable dt;
    
        private void InitData()
        {
          this.dt = new DataTable();
          this.dt.Columns.Add("Id", typeof(int));// 当前节点ID
          this.dt.Columns.Add("ParentId", typeof(int));// 父节点ID
          this.dt.Columns.Add("Name", typeof(string));// 节点名称
    
          this.dt.Rows.Add(new object[] { 1, 0, "中国" });
          this.dt.Rows.Add(new object[] { 2, 1, "四川" });
          this.dt.Rows.Add(new object[] { 3, 2, "成都" });
          this.dt.Rows.Add(new object[] { 3, 2, "绵阳" });
          this.dt.Rows.Add(new object[] { 4, 1, "重庆" });
        }
    
        /// <summary>
        /// 递归创建树
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="nodes">节点集合</param>
        /// <param name="parentId">父节点值</param>
        private void BuildTreeView(DataTable dt, TreeNodeCollection nodes, int parentId)
        {
          string filter = string.Format("ParentId = '{0}'", parentId);
          foreach (DataRow row in dt.Select(filter))
          {
            int id = (int)row["Id"];
            string name = (string)row["Name"];
    
            TreeNode node = new TreeNode();
            node.Tag = id;
            node.Text = name;
            nodes.Add(node); // 添加节点
    
            this.BuildTreeView(dt, node.Nodes, id); // 递归添加当前节点的子节点
          }
        }
    
        private void btnCreateNewNode_Click(object sender, EventArgs e)
        {
          TreeNode newNode = new TreeNode("新节点");
    
          TreeNodeCollection nodes = this.treeView1.SelectedNode.Parent == null
            ? this.treeView1.Nodes
            : this.treeView1.SelectedNode.Parent.Nodes;
    
          // 指定节点前插入新节点
          //nodes.Insert(this.treeView1.SelectedNode.Index, newNode);
    
          // 指定节点后插入新节点
          if (nodes.Count == (this.treeView1.SelectedNode.Index + 1))
            nodes.Add(newNode);
          else
            nodes.Insert(this.treeView1.SelectedNode.Index + 1, newNode);
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2010年8月28日 3:13
    版主
  • 不是非常清楚你的代码和数据库(表)的结构,请参考下面的递归方程代码:

    private void Page_Load(object sender, System.EventArgs e)
      {
       if(!Page.IsPostBack)
       {
       TreeNode newnode=new TreeNode();
        newnode.Text="中国";
        this.TreeView1.Nodes.Add(newnode);
        this.InitTree(this.TreeView1.Nodes[0].Nodes,0,dt);
       }

      }


    private void InitTree(TreeNodeCollection Nds,int parentID,DataTable dt)
      {
       TreeNode tmpNd;
       DataRow []rows=dt.Select("ParentID="+parentID);


       //使用foreach语句 来判断递归结束的条件
       foreach(DataRow row in rows)
       {
        tmpNd=new TreeNode();
        tmpNd.ID=row["ID"].ToString();
        tmpNd.Text=row["CityProvince"].ToString();
        Nds.Add(tmpNd);

        InitTree(tmpNd.Nodes,Convert.ToInt32(tmpNd.ID),dt);
       }
      }

    2010年8月30日 2:45

全部回复

  • 你好!

    能帖出递归的代码吗?


    知识改变命运,奋斗成就人生!
    2010年8月27日 8:09
    版主
  • 下面是我以前写的递归创建树的例子,希望对你有帮助!

    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Windows.Forms;
    
    namespace X.WinForms.UI.Controls.TreeViews
    {
      public partial class D001 : Form
      {
        public D001()
        {
          InitializeComponent();
    
          this.InitData(); // 初始数据
          this.BuildTreeView(this.dt, this.treeView1.Nodes, 0); // 递归创建树
        }
    
        private DataTable dt;
    
        private void InitData()
        {
          this.dt = new DataTable();
          this.dt.Columns.Add("Id", typeof(int));// 当前节点ID
          this.dt.Columns.Add("ParentId", typeof(int));// 父节点ID
          this.dt.Columns.Add("Name", typeof(string));// 节点名称
    
          this.dt.Rows.Add(new object[] { 1, 0, "中国" });
          this.dt.Rows.Add(new object[] { 2, 1, "四川" });
          this.dt.Rows.Add(new object[] { 3, 2, "成都" });
          this.dt.Rows.Add(new object[] { 3, 2, "绵阳" });
          this.dt.Rows.Add(new object[] { 4, 1, "重庆" });
        }
    
        /// <summary>
        /// 递归创建树
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="nodes">节点集合</param>
        /// <param name="parentId">父节点值</param>
        private void BuildTreeView(DataTable dt, TreeNodeCollection nodes, int parentId)
        {
          string filter = string.Format("ParentId = '{0}'", parentId);
          foreach (DataRow row in dt.Select(filter))
          {
            int id = (int)row["Id"];
            string name = (string)row["Name"];
    
            TreeNode node = new TreeNode();
            node.Tag = id;
            node.Text = name;
            nodes.Add(node); // 添加节点
    
            this.BuildTreeView(dt, node.Nodes, id); // 递归添加当前节点的子节点
          }
        }
    
        private void btnCreateNewNode_Click(object sender, EventArgs e)
        {
          TreeNode newNode = new TreeNode("新节点");
    
          TreeNodeCollection nodes = this.treeView1.SelectedNode.Parent == null
            ? this.treeView1.Nodes
            : this.treeView1.SelectedNode.Parent.Nodes;
    
          // 指定节点前插入新节点
          //nodes.Insert(this.treeView1.SelectedNode.Index, newNode);
    
          // 指定节点后插入新节点
          if (nodes.Count == (this.treeView1.SelectedNode.Index + 1))
            nodes.Add(newNode);
          else
            nodes.Insert(this.treeView1.SelectedNode.Index + 1, newNode);
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2010年8月28日 3:13
    版主
  • 不是非常清楚你的代码和数据库(表)的结构,请参考下面的递归方程代码:

    private void Page_Load(object sender, System.EventArgs e)
      {
       if(!Page.IsPostBack)
       {
       TreeNode newnode=new TreeNode();
        newnode.Text="中国";
        this.TreeView1.Nodes.Add(newnode);
        this.InitTree(this.TreeView1.Nodes[0].Nodes,0,dt);
       }

      }


    private void InitTree(TreeNodeCollection Nds,int parentID,DataTable dt)
      {
       TreeNode tmpNd;
       DataRow []rows=dt.Select("ParentID="+parentID);


       //使用foreach语句 来判断递归结束的条件
       foreach(DataRow row in rows)
       {
        tmpNd=new TreeNode();
        tmpNd.ID=row["ID"].ToString();
        tmpNd.Text=row["CityProvince"].ToString();
        Nds.Add(tmpNd);

        InitTree(tmpNd.Nodes,Convert.ToInt32(tmpNd.ID),dt);
       }
      }

    2010年8月30日 2:45