包含家谱树控件access源码的词条

hacker|
169

文章目录:

数据结构C语言版制作家谱树,求大神解答着急!!!!

就是树形结构,用结构体表示一个人,其成员变量包括姓名年龄等个人信息外,再包含几个指针或者指针数组,指向其他结构体(比如其父母和子女)。

C#treeview控件动态加载ACCESS数据库的问题(在Windows应用程序中使用) 求完整的C#代码

看了一下,这个比较适合你。这是完整代码

private DataSet ds;

private SqlDataAdapter sqlDataAdapter1;

private int maxnodeid;

private void Form1_Load(object sender, System.EventArgs e)

{

string strconn=ConfigurationSettings.AppSettings["ConnStr"];

sqlConnection1 = new SqlConnection(strconn);

this.sqlConnection1.Open();

//填充DataSet

this.CreateDataSet();

//从数据库中读取数据,通过递归生成树。

InitTree(this.treeView1.Nodes,"0");

}

private void CreateDataSet()

{

this.sqlDataAdapter1=new SqlDataAdapter("select * from s_menu ",this.sqlConnection1);

this.ds=new DataSet();

this.sqlDataAdapter1.Fill(ds,"tree");

}

private void InitTree(TreeNodeCollection Nds,string parentId)

{

DataView dv=new DataView();

TreeNode tmpNd;

string intId;

dv.Table=ds.Tables["tree"];

dv.RowFilter="ParentId='" + parentId + "'" ;

foreach(DataRowView drv in dv)

{

tmpNd=new TreeNode();

tmpNd.Tag=drv["NodeId"].ToString();

tmpNd.Text=drv["NodeName"].ToString();

Nds.Add(tmpNd);

intId=drv["ParentId"].ToString();

InitTree(tmpNd.Nodes,tmpNd.Tag.ToString());

}

}

//新增节点操作

private void insert(string type)

{//判断是新增树节点,还是子节点.

string strinsert="insert into s_menu values('{0}','{1}','{2}')";

string strformat="";

if(type=="sub")

strformat=string.Format(strinsert,maxnodeid.ToString(),this.selectnode.Tag.ToString(),this.strcomm);

else

strformat=string.Format(strinsert,maxnodeid.ToString(),"0",this.strcomm);

SqlCommand cmd=new SqlCommand(strformat,this.sqlConnection1);

cmd.ExecuteNonQuery();

}

//为新增节点算出最大的节点值,并以此值作为新增的节点ID值

private int GetMaxNodeid()

{

int pre=0,last=0;

DataSet maxds=new DataSet();

this.sqlDataAdapter1=new SqlDataAdapter("select nodeid from s_menu order by nodeid",this.sqlConnection1);

this.sqlDataAdapter1.Fill(maxds);

for(int i=0;i{

if(i+1{

pre=int.Parse(maxds.Tables[0].Rows[i][0].ToString());

last=int.Parse(maxds.Tables[0].Rows[i+1][0].ToString());

if(last-pre!=1)

return pre+1;

}

}

return last+1;

}

private void getallnode(TreeNode tn)

{

foreach(TreeNode node in tn.Nodes)

{

list.Add(node.Tag.ToString());

if(node.Nodes.Count0)

{

getallnode(node);

}

}

}

private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

//判断是否点击了某个节点

this.selectnode= this.treeView1.GetNodeAt (e.X ,e.Y );

if(selectnode==null)

this.isselected=false;

else

this.isselected=true;

}

private void menuAdd_Click(object sender, System.EventArgs e)

{//判断是否点击了某个节点,若没有点击了,则是新增一个树节点

if(isselected==false)

{//算出新增树节点的ID值

maxnodeid=GetMaxNodeid();

TreeNode tmpNd=new TreeNode();

//赋值

tmpNd.Tag=this.maxnodeid.ToString();

FormCommon frmCommon=new FormCommon();

DialogResult result= frmCommon.ShowDialog();

if(result==DialogResult.OK)

{//取到新增树节点的文本值

tmpNd.Text=frmCommon.strcomm;

this.strcomm=frmCommon.strcomm;

//新增树节点

this.treeView1.Nodes.Add(tmpNd);

//插入数据库(说明插入的是树节点)

this.insert("root");

//展开

this.selectnode.Expand();

}

}

else

{//判断是否点击了某个节点,若点击了,则是新增一个子节点

this.contextAddSub();

}

}

private void contextAddSub()

{//得到新增子节点的ID值

maxnodeid=GetMaxNodeid();

TreeNode tmpNd=new TreeNode();

//赋值

tmpNd.Tag=this.maxnodeid.ToString();

FormCommon frmCommon=new FormCommon();

DialogResult result= frmCommon.ShowDialog();

if(result==DialogResult.OK)

{//取到新增树节点的文本值

tmpNd.Text=frmCommon.strcomm;

this.strcomm=frmCommon.strcomm;

//新增子节点

this.selectnode.Nodes.Add(tmpNd);

//插入数据库(说明插入的是子节点)

this.insert("sub");

//展开

this.treeView1.SelectedNode.Expand();

}

}

//删除节点操作

private void menuDel_Click(object sender, System.EventArgs e)

{//新建一个ArrayList,用于保存要删除的节点下边的所有子节点

list=new ArrayList();

if(this.isselected==true)

{//得到删除的节点下边的所有子节点

getallnode(this.selectnode);

//把要删除的节点也加进去

list.Add(this.selectnode.Tag.ToString());

//循环从数据库中删除

for(int i=0;i{

string strdel="delete s_menu where nodeid='{0}'";

string strformat="";

strformat=string.Format(strdel,list[i]);

SqlCommand cmd=new SqlCommand(strformat,this.sqlConnection1);

cmd.ExecuteNonQuery();

}

//从树中删除

this.selectnode.Remove();

}

}

//修改节点的值

private void menuEdit_Click(object sender, System.EventArgs e)

{

if(this.isselected==true)

{

FormCommon frmCommon=new FormCommon();

DialogResult result= frmCommon.ShowDialog();

if(result==DialogResult.OK)

{

string strdel="update s_menu set nodename= '{1}' where nodeid='{0}'";

string strformat="";

strformat=string.Format(strdel,this.selectnode.Tag.ToString(),frmCommon.strcomm);

SqlCommand cmd=new SqlCommand(strformat,this.sqlConnection1);

cmd.ExecuteNonQuery();

this.selectnode.Text=frmCommon.strcomm;

}

}

}

//遍历所有节点.查找值

private void getvaluenode(TreeNodeCollection tn,string value)

{

foreach(TreeNode node in tn)

{

if(node.Nodes.Count0)

{

getvaluenode(node.Nodes,value);

}

if(node.Text==value)

listnode.Add(node);

}

}

private void menuSearch_Click(object sender, System.EventArgs e)

{

int j,k;

this.listnode=new ArrayList();

FormCommon frmCommon=new FormCommon();

DialogResult result= frmCommon.ShowDialog();

if(result==DialogResult.OK)

{

TreeNode n =new TreeNode();

TreeNode temp=new TreeNode();

//下面的函数是填充listnode;

getvaluenode(this.treeView1.Nodes,frmCommon.strcomm);

for(int i=0;i{

j=0;k=0;

n=(TreeNode)listnode[i];

if (n != null)

{

temp=n;

//得到上面结点的数量,并将数量保存到变量j;

for(;n.Parent!=null;)

{

n=n.Parent;

j++;

}

//恢复原值

n=temp;

//新建一个树结点数组做保存得到查询到的所有节点.

TreeNode[] m=new TreeNode[j];

for(;n.Parent!=null;)

{

n=n.Parent;

m[k]=n;

k++;

}

for(int p=0;pm[p].Expand();

n=temp;

n.ForeColor=Color.Red;

}

}

}

}

private void treeView1_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)

{

if(this.treeView1.SelectedNode.Text!=null)

{

string strdel="update s_menu set nodename= '{1}' where nodeid='{0}'";

string strformat="";strformat=string.Format(strdel,this.treeView1.SelectedNode.Tag.ToString(),e.Label.ToString());SqlCommand cmd=new SqlCommand(strformat,this.sqlConnection1);

cmd.ExecuteNonQuery();

}

}

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)

{

this.listBox1.Items.Clear();

this.listBox1.Items.Add(this.treeView1.SelectedNode.FullPath.ToString());

}

}

}

mfc 读取文件建立家谱树,分那几部操作步骤

如果你说的家谱树在文件中,毫无疑问需要先打开文件读取内容,然后写进树控件,这个没错;

读取内容的时候,这些内容是放在内存中的,可以用一个长字符串保存,也可以用字符串数组保存,根据文件内容采取不同的方式;

通常的做法是保存在一个长字符串中,然后解析字符串分离每个元素信息;当然,如果文件内容结构良好,也可以采取按行读取的方式

access中怎样实现树状结构

详见:

TreeView 控件

TreeView 控件显示 Node 对象的分层列表,每个 Node 对象均由一个标签和一个可选的位图组成。TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。

语法

Treeview

说明

创建了 TreeView 控件之后,可以通过设置属性与调用方法对各 Node 对象进行操作,这些操作包括添加、删除、对齐和其它操作。可以编程展开与折回 Node 对象来显示或隐藏所有子节点。Collapse、Expand 和 NodeClick 三个事件也提供编程功能。

Node 对象使用 Root、Parent、Child、FirstSibling、Next、Previous 和 LastSibling 属性。在代码中可通过检索对 Node 对象的引用,从而在树上定位。也可以使用键盘定位。UP ARROW 键和 DOWN ARROW 键向下循环穿过所有展开的 Node 对象。从左到右、从上到下地选择 Node 对象。若在树的底部,选择便跳回树的顶部,必要时滚动窗口。RIGHT ARROW 键和 LEFT ARROW 键也穿过所有展开的 Node 对象,但是如果选择了未展开的 Node之后再按 RIGHT ARROW 键,该 Node 便展开;第二次按该键,选择将移向下一个 Node。相反,若扩展的 Node 有焦点,这时再按 LEFT ARROW 键,该 Node 便折回。如果按下 ANSI 字符集 中的键,焦点将跳转至以那个字母开头的最近的 Node。后续的按该键的动作将使选择向下循环,穿过以那个字母开头的所有展开节点。

控件的外观有八种可用的替换样式,它们是文本、位图、直线和 +/- 号的组合,Node 对象可以任一种组合出现。

TreeView 控件使用由 ImageList 属性指定的 ImageList 控件,来存储显示于 Node 对象的位图和图标。任何时刻,TreeView 控件只能使用一个 ImageList。这意味着,当 TreeView 控件的 Style 属性被设置成显示图像的样式时,TreeView 控件中每一项的旁边都有一个同样大小的图像。

发行注意 TreeView 控件是 MSCOMCTL.OCX 文件中的一组 ActiveX 控件的一部分。为了在应用程序中使用 TreeView 控件,必须将 MSCOMCTL.OCX 文件

2. Sorted 属性(TreeView 控件)

返回或设置一值,此值确定 Node 对象的子节点是否按字母顺序排列。

返回或设置一值,此值确定 TreeView 控件的根层节点是否按字母顺序排列。

语法

object.Sorted [ = boolean]

Sorted 属性语法包含下面部分:

部分 描述

object 对象表达式,其值是“应用于”列表中的一个对象。

boolean 布尔表达式,表示 Node 对象是否已被排序如“设置值”中描述。

设置值

boolean 的设置值是:

设置值 描述

True Node 对象根据它们的 Text 属性按字母顺序排列。其 Text 属性由数字开始的 Node 对象也作为字符串排序,第一个数字确定在排序中的初始位置,后面的数字确定以后的排序。

False Node 对象不排序。

说明

Sorted 属性有两种用法,第一,在 TreeView 控件的根(顶)层排列 Node 对象,第二,对任何单个 Node 对象的立即子节点排序。例如,下面的代码是对 TreeView 控件的根节点排序:

Private Sub Command1_Click()

3. EnsureVisible 方法

这个方法确保指定的 ListItem 或 Node 对象是可视的。如果需要,这个方法可展开 Node 对象并滚动 TreeView 控件。该方法仅可滚动 ListView 控件。

语法

object.EnsureVisible

object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。

返回值

值 描述

True 如果 ListView 或 TreeView 控件必须滚动与/或扩展以显露该对象,该方法返回 True。

False 如果不需滚动与/或展开,该方法返回 False。

说明

一个特定的 Node 或 ListItem 对象可能深藏于 TreeView 或 ListView 控件中,当要使其为可视时,使用 EnsureVisible 方法。

如果 Scroll 属性设置为 False,则该方法将不会在 TreeView 控件上起作用。

 

4. Node 对象和 Nodes 集合

Node 对象是 TreeView 控件中的一项,它包含图像和文本。

Nodes 集合包含一个或多个 Node 对象。

语法

treeview.Nodes

treeview.Nodes.Item(index)

以上语法行,按照标准集合语法分别引用集合与集合中的单独元素。

treeview 对象表达式,其值是 TreeView 控件。

index 整数或字符串,它唯一地标识 Nodes 集合的一个成员。整数是 Index 属性的值,字符串是 Key 属性的值。

说明

节点可包含文本和图片。然而,要使用图片,必须用 ImageList 属性关联一个 ImageList 控件。

图片可以根据节点的状态而改变;例如,如果将 SelectedImage 属性设置为来自关联的 ImageList 的图像,则被选中的节点可拥有与未选中的节点不同的图片。

5. Add 方法(Nodes 集合)

在 Treeview 控件的 Nodes 集合中添加一个 Node 对象。

语法

object.Add(relative, relationship, key, text, image, selectedimage)

Add 方法的语法包含下面部分:

描述

object 必需的。对象表达式,其值是“应用于”列表中的一个对象

relative 可选的。已存在的 Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。

relationship 可选的。指定的 Node 对象的相对位置,如设置值中所述。

key 可选的。唯一的字符串,可用于用 Item 方法检索 Node。

text 必需的。在 Node 中出现的字符串。

image 可选的。在关联的 ImageList 控件中的图像的索引。

selectedimage 可选的。在关联的 ImageList 控件中的图像的索引,在 Node 被选中时显示。

设置值

relationship 的设置值是:

6. Root 属性(Node 对象)

返回对所选 Node 的根 Node 对象的引用。

语法

object.Root

object 所在处代表是对象表达式,其值是“应用于”列表中的对象

说明

Child、FirstSibling、LastSibling、Previous、Parent、Next 和 Root 各属性全将返回对另一个 Node 对象的引用。因此,可以同时引用并执行对 Node 的操作,如下所示:

With TreeView1.Nodes(x).Root

.Text = "New text"

.Key = "New key"

.SelectedImage = 3

End With

也可以将对象变量设置为被引用的 Node,如下所示:

Dim NodRoot As Node

'得到对节点 x 的根的引用。

Set NodRoot = TreeView1.Nodes(x).Root

'用此引用执行对根节点的操作。

With nodRoot

.Text = "New text" '改变文本。

.Key = "New key" '改变键。

.SelectedImage = 3 '改变 SelectedIma

 

7. Parent 属性(Node 对象)

这个属性返回或设置 Node 对象的父对象。仅在运行时可用。

语法

object.Parent[ = node]

Parent 属性的语法包含下面部分:

部分 描述

object 对象表达式,其值是“应用于”列表中的一个对象。

node 变成该对象的父对象的 Node 对象。 

说明

在运行时,设置这个属性为一个对象的操作不能搞成一个循环,否则便发生错误。例如,不能将任何 Node 设置成为其后代的子 Node。

Child、FirstSibling、LastSibling、Previous、Parent、Next 和 Root 属性都返回对另一个 Node 对象的引用。所以可以同时引用并执行对一个 Node 的操作,如下所示:

With TreeView1.Nodes(x).Parent

.Text = "New text"

.Key = "New key"

.SelectedImage = 3

End With

也可以将对象变量设置为引用的 Node,如下所示:

Dim NodParent As Node

Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)

'如果用户没移动鼠标,或在无效区释放它。

If TreeView1.DropHighlight Is Nothing Then

indrag = False

Exit Sub

Else

'设置被拖动的节点的 parent 属性为目标节点。

On Error GoTo checkerror '阻止循环错误。

Set nodX.Parent = TreeView1.DropHighlight

Cls

Print TreeView1.DropHighlight.Text _

" is parent of " nodX.Text

'释放 DropHighlight 引用。

Set TreeView1.DropHighlight = Nothing

indrag = False

Exit Sub '如未发生错误则退出。

End If

checkerror:

'定义表示 Visual Basic 错误代码的常数。

Const CircularError = 35614

If Err.Number = CircularError Then

Dim msg As String

msg = "A node can't be made a child of its own children."

'显示带有一个感叹号图标

'和“确定”与“取消”按钮的消息框。

If MsgBox(msg, vbExclamation vbOKCancel) = vbOK Then

'释放

9. Children 属性

这个属性返回包含在 Node 对象中的各子 Node 对象的个数。

语法

object.Children

object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。

说明

在执行一个影响子节点的操作之前,可用 Children 属性检查 Node 对象是否有子节点。例如,以下代码在检索第一个 Node 的 Text 属性之前,使用 Child 属性检查子节点的存在。

Private Sub TreeView1_NodeClick(ByVal Node As Node)

If Node.Children 0 Then

MsgBox Node.Child.Text

End If

End Sub

Children 属性示例

这个例子在 TreeView 控件中放置几个 Node 对象。这组代码检查 Node 是否有子节点。如果有,则显示子节点的文本。为试用此例,在窗体上安放一个 TreeView 控件,并在窗体的声明部分中粘贴下面的代码。运行此例,单击 Node 对象以选择它,然后单击该窗体来察看 Node 对象的子节点的文本。

Option Explicit

Private Sub Form_Click()

Dim strC As String

Dim N As Integer

If TreeView1.SelectedItem.Children 0 Then '有子节点。

10. FirstSibling 属性(Node 对象)

这个属性返回对 TreeView 控件中的 Node 对象的第一个相邻对象的引用。

语法

object.FirstSibling

object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象

说明

第一个相邻节点是出现在一个节点层中第一个位置上的 Node。实际上到底是哪一个 Node 出现在第一个位置取决于在那一层上的 Node 对象是否被排序,这由 Sorted 属性确定。

Child、FirstSibling、LastSibling、Previous、Parent、Next 和 Root 属性都返回对另一个 Node 对象的引用。所以可以同时引用并执行对一个 Node 的操作,如下所示:

With TreeView1.Nodes(x).FirstSibling

.Text = "New text"

.Key = "New key"

.SelectedImage = 3

End With

也可以将对象变量设置为引用的 Node,如下所示:

Dim NodFirstSib As Node

'获取 Node x 的第一个相邻节点的引用。

Set NodFirstSib = TreeView1.Nodes(x).FirstSibling

'使用这个引用执行对第一个相邻 Node 的操

常数 值 描述 

请问再用vb中的树形控件表示access中的数据库时,数据库是如何编写的,也是分出等级来的吗,

要这样分析与理解:

树形控件中的每个节点有一个唯一性质的 Key属性,其次,每个节点有一个父节点属性,最后每个节点有一个名称(显示的文本)。另外,你如果需要对同一个父节点中的所有子节点按照先后排列次序,那么还要加一个在本层次里的序号。所以,这些就是你需要在数据表里描述的。除此之外,你还可以根据自己实际需要增加其他字段,而有了上述字段,就可以通过代码读取并添加到树形控件里了。

4条大神的评论

  • avatar
    访客 2022-07-03 上午 01:15:24

    lConnection1); this.ds=new DataSet(); this.sqlDataAdapter1.Fill(ds,"tree"); } private void InitTree(Tr

  • avatar
    访客 2022-07-02 下午 05:57:14

    s.CreateDataSet(); //从数据库中读取数据,通过递归生成树。 InitTree(this.treeView1.Nodes,"0"); } private void CreateDataSet()

  • avatar
    访客 2022-07-03 上午 12:57:38

    System.EventArgs e) { string strconn=ConfigurationSettings.AppSettings["ConnStr"]; sqlConnection1 = new SqlConnecti

  • avatar
    访客 2022-07-02 下午 08:36:43

    ew FormCommon(); DialogResult result= frmCommon.ShowDialog(); if(result==DialogResult.OK) { strin

发表评论