初学C#,请问一个treeview显示数据库的分层数据并增删节点的问题,急,多谢!

beachday 2002-10-30 09:06:24
被这个问题困扰几天了,要求生成一个树视图按照树形结构显示数据库中的数据,并且每增加、删除一个节点后端的数据库也相应着修改。

我的方法是用子节点表示法来存储这棵树,数据库中三个表项: index_id, parent_id, index_name,分别代表本节点id,父节点id,和本节点的显示节点名。节点的唯一标志号index_id自然是主键。

才刚毕业,开发经验还不多,对于控件的属性也不怎么熟悉。算法的思想倒是有,关于递归生成每一个子节点以及每删除一个节点后递归调用函数去遍历该节点的子节点也写了伪代码。但是具体实现的过程中麻烦多多,从数据库生成树的程序编译通过,运行时报了异常,无法初始化实例:

“未处理的“System.NullReferenceException”类型的异常出现在 treetest.exe 中

其他信息:未将对象引用设置到对象的实例。”

代码如下,请高手帮忙看一看,不能实例化的问题在哪里,如果能再给一个相关的数据库生成树视图的示例源码就更加感激不尽了,多谢!以前我看过相关的回答,是建议数据集转化成xml来实现的,但是我不了解xml的具体内容,因此希望能有直接和数据库关联操作的例子。


程序如下: 其中程序运行时中断在public Form1()处并报异常


namespace treetest
{

/// Form1 的摘要说明。

public class Form1 : System.Windows.Forms.Form
{
private System.Data.OleDb.OleDbConnection oleDbConnection1;
private System.Data.OleDb.OleDbCommand oleDbSelectCommand1;
private System.Data.OleDb.OleDbCommand oleDbInsertCommand1;
private System.Data.OleDb.OleDbCommand oleDbUpdateCommand1;
private System.Data.OleDb.OleDbCommand oleDbDeleteCommand1;
private treetest.DataSet1 dsViewtree; //数据集
private System.Data.OleDb.OleDbDataAdapter daViewtree; //数据适配器

private System.ComponentModel.Container components = null;
protected System.Windows.Forms.TreeView treeview1 ; //先定义一个树形控件

private void InitTree(TreeNodeCollection Nds,string parentId)
{
daViewtree.Fill(dsViewtree,"viewtree");
DataView dv=new DataView();
TreeNode tmpNd;
string intId;
dv.Table=dsViewtree.Tables["viewtree"];
dv.RowFilter="parent_id="+"'" +parentId+"'";//筛选器,筛选结果数据表中parent_id是那些等于传进来parentId的行
foreach (DataRowView drv in dv)
{
tmpNd=new TreeNode();
string tmpNd_ID=drv["index_id"].ToString();
tmpNd.Text=drv["index_name"].ToString();
Nds.Add(tmpNd);
intId=drv["parent_id"].ToString();
InitTree(tmpNd.Nodes,tmpNd_ID);//递归地生成显示子树
}
}

public Form1()
{
InitializeComponent();
InitTree(treeview1.Nodes,"0"); //问题就出在这里,无法实例化,其中后面的“0”代表数据库中的根节点的id(已有此纪录)

}


protected override void Dispose( bool disposing )……
#region Windows Form Designer generated code
private void InitializeComponent()…… //这里的我就省略了

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}

再次感谢!急切等待答案中……


...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
beachday 2002-10-31
  • 打赏
  • 举报
回复
嗯……真的不好意思,我以为树是程序自己一个一个节点生成的,没想到一开始还是得先生成一棵树,然后再把节点挂上去啊:)

to jackyhx(飞起来的侠):不好意思,经验尚浅,让你见笑了:)

to Tracy_Z(一个人的精彩):对不起,能告诉我gz是什么意思么:)
Tracy_Z 2002-10-31
  • 打赏
  • 举报
回复
gz
龙腾九霄 2002-10-31
  • 打赏
  • 举报
回复
佩服得五体投地!!
ele_faint 2002-10-31
  • 打赏
  • 举报
回复
晕..
beachday 2002-10-31
  • 打赏
  • 举报
回复
嗯,faint死了,这下自己倒解决了……原来是没有把树形控件拖到form上,只是自己在程序后端定义生成了一棵树,却没有new一个啊!!
beachday 2002-10-31
  • 打赏
  • 举报
回复
up

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧