关于treeview,帮看看哪里有问题。。初学者。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void AddNodes(DataTable dt, string id, string text, string pid)
{
DataRow[] dr = dt.Select("pid = '" + string.Empty + "'");
foreach (DataRow drv in dr)
{
TreeNode tn = new TreeNode();
tn.Text = drv[text].ToString();
tn.Tag = drv[id];
treeView1.Nodes.Add(tn);
AddChild(tn, dt, id, text, pid);
}
}
private void AddChild(TreeNode tn, DataTable dt, string id, string text, string pid)
{
DataRow[] dr = dt.Select("pid ='" + tn.Tag.ToString() + "'");
if (dr.Length > 0)
{
foreach (DataRow dr1 in dr)
{
TreeNode tnc = new TreeNode();
tnc.Text = dr1[Text].ToString();
tnc.Tag = dr1[id];
AddChild(tnc, dt, id, text, pid);
}
}
}
private DataTable GetDatatable()
{
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("text", typeof(string));
dt.Columns.Add("pid", typeof(string));
DataRow row1;
row1 = dt.NewRow();
row1[0] = "A";
row1[1] = "A";
row1[2] = DBNull.Value;
dt.Rows.Add(row1);
row1 = dt.NewRow();
row1[0] = "A1";
row1[1] = "A1";
row1[2] = "A";
dt.Rows.Add(row1);
row1 = dt.NewRow();
row1[0] = "A11";
row1[1] = "A11";
row1[2] = "A1";
dt.Rows.Add(row1);
row1 = dt.NewRow();
row1[0] = "B";
row1[1] = "B";
row1[2] = DBNull.Value;
dt.Rows.Add(row1);
row1 = dt.NewRow();
row1[0] = "B1";
row1[1] = "B1";
row1[2] = "B";
dt.Rows.Add(row1);
row1 = dt.NewRow();
row1[0] = "B11";
row1[1] = "B11";
row1[2] = "B1";
dt.Rows.Add(row1);
return dt;
}
private void button1_Click(object sender, EventArgs e)
{
AddNodes(GetDatatable(), "id", "text", "pid");
}
}
}
[解决办法]
首先指出DBNull.Value并不等价于String.Empty 所以你的第一个dt.Select是获取不到任何行的 所以你的TreeView上什么都没有 把你pid那一行的值改成空字符串 "" 这样
其次 你的递归太混乱了 你真要用递归的话 就把AddNodes和AddChild整合成一个递归 否则很容易出现无限循环递归的问题