当前位置:首页 » 操作系统 » 树控件源码

树控件源码

发布时间: 2022-05-03 16:28:51

① 如何用js实现简单的树控件

我之前写过一个,很简单,也就下面几个函数:
function topOfList()
{
var btn = document.getElementById('topOfListBtn');
if(btn.state == 'spaned')
{
var forms = document.getElementsByTagName('form');
var timeSpan = 50;
for(var i = 0;i<forms.length;i++)
{
var form = forms[i];
if(form.id.indexOf('Top') > -1)
{
ShinkSlowly(form,timeSpan);
timeSpan += 50;
}
}
btn.state = 'unspaned';
changeBtnImg('topOfListImg','img/unspaned.jpg');
tellConsoleSpanSate();
}
else
{
var forms = document.getElementsByTagName('form');
var timeSpan = 50;
for(var i = 0;i<forms.length;i++)
{
var form = forms[i];
if(form.id.indexOf('Top') > -1)
{
SpanSlowly(form,timeSpan);
timeSpan += 50;
}
}
btn.state = 'spaned';
changeBtnImg('topOfListImg','img/spaned.jpg');
tellConsoleSpanSate();
}
}
function bottomOfList()
{
var btn = document.getElementById('bottomOfListBtn');
if(btn.state == 'spaned')
{
var forms = document.getElementsByTagName('form');
var timeSpan = 50;
for(var i = 0;i<forms.length;i++)
{
var form = forms[i];
if(form.id.indexOf('Bottom') > -1)
{
ShinkSlowly(form,timeSpan);
timeSpan += 50;
}
}
btn.state = 'unspaned';
changeBtnImg('bottomOfListImg','img/unspaned.jpg');
tellConsoleSpanSate();
}
else
{
var forms = document.getElementsByTagName('form');
var timeSpan = 50;
for(var i = 0;i<forms.length;i++)
{
var form = forms[i];
if(form.id.indexOf('Bottom') > -1)
{
SpanSlowly(form,timeSpan);
timeSpan += 50;
}
}
btn.state = 'spaned';
changeBtnImg('bottomOfListImg','img/spaned.jpg');
tellConsoleSpanSate();
}
}
function ShinkSlowly(form,timeSpan)//控制按钮收缩的函数
{
setTimeout(function()
{
form.style.display = 'none';
}
,timeSpan);
}
function SpanSlowly(form,timeSpan)//控制按钮展开的函数
{
setTimeout(function()
{
form.style.display = '';//alert(form.id);
}
,timeSpan);
}
function changeBtnImg(imgId, imgSrc)
{
document.getElementById(imgId).src=imgSrc;//'img/unspaned.jpg';'img/spaned.jpg';
}

其中,imgSrc要换成你硬盘里存在的图片路径。然后在你的+号图片的单击事件响应使用topOfList()函数即可,我测试过,可用。ShinkSlowly()函数内部可以控制张开和收缩的速度。

② c#语言asp.net实现treeview控件读数据库动态生成树的代码

来自csdn上面的例子我试过可以
1.下载地址
http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
安装后,通过“自定义工具箱”->“.net框架组件”把TreeView添加到工具箱里
2.运行时无法显示
一般是TreeView的版本问题,最好下载英文版自动安装版本重新安装,安装前应该先到添加删除程序里卸掉原版本

3.显示格式出错(非树状显示)
TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0

4.框架里使用TreeView
设置NavigateUrl、Target属性,可更新另外的Frame

5.找不到TreeNode类
使用TreeView,最好添加namespace:using Microsoft.Web.UI.WebControls;

6.遍历TreeView节点(递归算法)
private void Page_Load(object sender, System.EventArgs e)
{
GetAllNodeText(TreeView1.Nodes);
}
void GetAllNodeText(TreeNodeCollection tnc)
{
foreach(TreeNode node in tnc)
{
if(node.Nodes.Count!=0)
GetAllNodeText(node.Nodes);
Response.Write(node.Text + " ");
}
}

7.得到node结点的父节点
TreeNode pnode;
if(node.Parent is TreeNode)
pnode=(TreeNode)node.Parent;
else
//node is root node

8.修改TreeView样式(示例)
<iewc:TreeView id="TreeView1" runat="server" HoverStyle="color:blue;background:#00ffCC;"

DefaultStyle="background:red;color:yellow;" SelectedStyle="color:red;background:#00ff00;">
用代码:
TreeView1.DefaultStyle["font-size"] = "20pt";

9.TreeView展开无闪烁的解决方法
http://expert.csdn.net/Expert/topic/1300/1300576.xml

客户端控制TreeView
http://expert.csdn.net/Expert/topic/1382/1382892.xml

1.设置所选节点,如选中第二个节点
function SetSelNode()
{
TreeView1.selectedNodeIndex="1";
}

2.得到所选节点的Text,ID或NodeData
function GetAttribute()
{
alert(TreeView1.getTreeNode(TreeView1.selectedNodeIndex).getAttribute("Text"));
}
替换Text为ID或NodeData,可分别得到所选节点的ID或NodeData

3.修改节点属性,如修改第一个节点的Text
function ModifyNode()
{
var node=TreeView1.getTreeNode("0");
node.setAttribute("Text","hgknight");
}

4.得到点击节点
function TreeView1.onclick()
{
alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute("Text"));
}

5.添加节点
function AddNode()
{
var node=TreeView1.createTreeNode();
node.setAttribute("Text","hgknight");
TreeView1.add(node);
}
6.js遍历所有节点
//只针对根结点,大家把它可改为递归形式
var NodeArray=new Array();
NodeArray=TreeView1.getChildren();
for(i=0;i<NodeArray.length;i++)
{
cNode=NodeArray[i];
alert(cNode.getAttribute("Text"));
}

1、用代码在treeview web控件中,添加node的方法

表字段:编号,父编号,名称
数据:
1 0 中华人民共和国
2 1 湖南
3 1 湖北

void creattree(string text,TreeNode tnd,string pid)
{

TreeNode t2=new TreeNode();
t2.Text=text;

tnd.Nodes.Add(t2);

生成
string str1 ="父编号 = '"+pid+"'";
DataRow[] dryl = dataSet31.Tables [0].Select(str1);

for(int i=0;i<=dryl.GetUpperBound(0);i++)
{

creattree(dryl[i][2].ToString(),t2,dryl[i][0].ToString());
}
}

//
TreeNode t1=new TreeNode();
t1.Text="地区信息";
TreeView2.Nodes.Add(t1);

creattree("中华人民共和国",t1,"1");

2、如何为TreeView添加事件?

Private Sub TreeView1_indexChanged(ByVal sender As Object, ByVal e As
Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs) Handles
TreeView1.SelectedIndexChange
Dim a As Integer
a = TreeView1.SelectedNodeIndex
TextBox1.Text = CStr(a)
End Sub
但是AutoPostBack设置为True的话,TreeView还要刷新,闪烁,我的TreeView比较庞大
,这可怎么办???苦恼中。。。

3、为什么TreeView 中的SelectedIndexChange为什么不执行???

AutoPostBack属性为真,SelectedIndexChange才能被执行。
不过这样的话你选择时会感到刷新得让你痛苦,根据你的具体实现的目的,采用变通的
方法,尽量不使用SelectedIndexChange事件吧。

selectedindexchange事件挂到控件上没有?
InitializeComponent方法中检查检查

4、如何判断 TreeView 的一个节点下是否有子节点???

if(selNode.Nodes.Count==0){
//该节点没有字节点
}

5、如何得到 TreeView 的当前选择节点???

1.Tree.GetNodeFromIndex(Tree.SelectedNodeIndex.ToString())
2.private void TreeView1_SelectedIndexChange(object sender,
Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
e.NewNode即为所选节点

6、treeview实现两层节点没问题,扩展到无限层就出问题了?

我的那个做法还不够完善,对于节点数较少的情况可以这样做,对于节点数较多的情况
,你就不能这样做了,你应该只加载一级,当点击节点展开时,再加载它的下一级子节
点。
数据库结构如下:
表名:Table1
ParentID varchar 20:父节点
ID varchar 20:节点
Name varchar 50:名称

来来来,这里给你个例程,再给个我的网页上的TreeViwe看看,一万个子节点都没问题。
http://dev1.eraserver.net/czc888/webform1.aspx
至于那三个图象的意义你看我的网页就知道了。分别表示一页纸(没有子节点)、一本
关闭的书(有子节点),一本打开的书(当前节点被展开)

void creat_node(string
name,Microsoft.Web.UI.WebControls.TreeNode t1,string number)
{
//定义一个新的结点

Microsoft.Web.UI.WebControls.TreeNode t2=new
Microsoft.Web.UI.WebControls.TreeNode();
t2.ID=number;
t2.Text=name;

//判断是否为根结点
TreeView1.ExpandedImageUrl="images/Depart03.bmp";
if(t1.ID.Trim()=="###")
{
TreeView1.Nodes.Add(t2);
t2.ImageUrl="images/Depart01.bmp";
}
else
{
t1.Nodes.Add(t2);
t2.ImageUrl="images/Depart01.bmp";
t1.ImageUrl="images/Depart02.bmp";
}

//取得这个结点的所有子结点,利用递归自动生成
string mySelectQuery = "SELECT ParentID, ID,Name FROM table1
where ParentID='" + number +"'";
string MyConnString="provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+Server.MapPath(".")+"/dt/mydata.mdb";
OleDbConnection myConnection = new
OleDbConnection(MyConnString);
OleDbCommand myCommand = new
OleDbCommand(mySelectQuery,myConnection);
myConnection.Open();
OleDbDataReader myReader;
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
creat_node(myReader.GetString(2),t2,myReader.GetString(1));

}
myReader.Close();
myConnection.Close();

}

private void CreateProviderTreeBtn_Click(object sender,
System.EventArgs e)
{
Microsoft.Web.UI.WebControls.TreeNode t1=new
Microsoft.Web.UI.WebControls.TreeNode();
creat_node("",t1,"###");

7、怎样使用TreeView???

//初始化TreeView数据
private void InitTV(int intVOrderLen)
{
SqlDataReader dr;
SqlCommand myCommand;
string strSel = "select * from bas_enterprise where
len(vieworder)="+intVOrderLen+" order by vieworder";
myCommand = new SqlCommand (strSel, myConnection);
dr=myCommand.ExecuteReader();
while (dr.Read ())
{
TreeNode pNode=new TreeNode ();
pNode.Text =dr["EntpName"].ToString ();
pNode.ID =dr["ViewOrder"].ToString ();
TreeView1.Nodes .Add (pNode);

}
dr.Close ();

}

private void TreeView1_SelectedIndexChange(object sender,
Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
{
TreeNode NewNode=TreeView1.GetNodeFromIndex
(TreeView1.SelectedNodeIndex);
string strNodeId=NewNode.ID .ToString ();
SqlDataReader dr;
SqlCommand myCommand;
int intVOrderLen=strNodeId.Length+2;
string strSel = "select * from bas_enterprise where
len(vieworder)="+intVOrderLen+" and vieworder like '%"+strNodeId+"__%'
order by vieworder";
myCommand = new SqlCommand (strSel, myConnection);
dr=myCommand.ExecuteReader();
NewNode.Nodes .Clear();
while (dr.Read ())
{
TreeNode pNode=new TreeNode ();
pNode.Text =dr["EntpName"].ToString ();
pNode.ID =dr["ViewOrder"].ToString ();
NewNode.Nodes.Add (pNode);
}
dr.Close ();
TreeView1.ExpandLevel=1;
}

8、在treeview中如何查找一个值,并选中它?

问题:
各位,在已经建好的树中如何查找一个文本或者是treenodes的id,找到后选中它?

答案:
for(int i=0;i<TreeView1.Nodes.Count;i++)
if(TreeView1.Nodes[i]==TextBox1.Text)
{
string index1=TreeView1.Nodes[i].GetNodeIndex();//取得index
TreeView1.SelectedNodeIndex=index1;
}

9、如何取得TreeView中各项的值??

private void TreeView1_SelectedIndexChange(object sender,
Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e)
{
Microsoft.Web.UI.WebControls.TreeNode
NewNode=TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex);
Label1.Text =NewNo

如果通过代码要在父结点中增加子节点,代码如何实现?
父节点代码如下:
TreeNode pNode = new TreeNode();
pNode.ID = "Root";
pNode.Text = strNodeName;
TreeView1.Nodes.Add(pNode);
如果要在根结点"Root"下面再增加子节点,如何写代码?
TreeView1.Nodes.AddAt(pNode);这种方式好象不行.
TreeView1.Nodes[0].Nodes.Add(pNewNode);

/*************.Cs 中的代码****************************

string strScript="<script language=\"javascript\" >";
strScript+=" function GetNode() \n"+"{ \n";
strScript+=" alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute('Text'));\n" ;
strScript+=" alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute('CheckBox'));\n";
strScript+=" alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute('Checked'));\n";
strScript+=" if (TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute('Checked'))\n";
strScript+=" TreeView1.getTreeNode(TreeView1.clickedNodeIndex).setAttribute('Checked','false');\n";
strScript+=" else \n";
strScript+=" TreeView1.getTreeNode(TreeView1.clickedNodeIndex).setAttribute('Checked','true');\n";
strScript+=" \n } \n";
strScript+="</script>";
if(! this.IsClientScriptBlockRegistered("myjs"))
{
this.RegisterClientScriptBlock("myjs",strScript);
}

***************************************************//

现在我想在客户端点击父节点的checkbox则下级也被选中,可是使用下面的代码,只能表面选中,在服务器端却得不到,请问有什么其它好法子
<script language=\"javascript\" >
function GetNode()
{
var choose;
var indexid;
indexid=TreeView1.clickedNodeIndex;
if (TreeView1.getTreeNode(indexid).getAttribute('Checked'))
{
choose=false;
}
else
{
choose=true;
}
TreeView1.getTreeNode(indexid).setAttribute('Checked',choose);
var NodeArray=new Array();
NodeArray=TreeView1.getTreeNode(indexid).getChildren();
for(i=0;i<NodeArray.length;i++)
{
var tempindex=indexid+"."+i;
TreeView1.getTreeNode(indexid).setAttribute('Checked',choose);
}
}
//-->
</script>

③ 用MFC做一个简单界面,左边用树控件制作目录,点击目录在右边显示目录内容,比如图片等。求源代码

有相似源码,是vc6的,左边是硬盘目录树,右边显示目录文件(不是显示图片),可以在此基础上改进,如需要留邮箱

④ java树形控件

我写过,你要的话可以发给你,可以后台联系,为了符合回答规范,还是把代码贴出来(鉴于篇幅仅帖一个文件):

package ui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class TreePanel extends JPanel {
private Vector<TreePanelNode> nodes;
private Vector<Integer> selectedNodes;

private int tmpX, tmpY;
private int editingNode = -1;
private int addingParent = -2;
private int mouseX, mouseY;

public TreePanel () {
nodes = new Vector<TreePanelNode>();
selectedNodes = new Vector<Integer>();

setBackground(Color.WHITE);
addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent me) {
tmpX = me.getX();
tmpY = me.getY();
if (nodes.size() == 0) {
addingParent = -1;
}
int i = 0;
for (; i<nodes.size(); i++) {
if (nodes.get(i).getBounds().contains(mouseX, mouseY)) {
if (me.isControlDown()) {
if (!selectedNodes.contains(i))
selectedNodes.add(i);
else
selectedNodes.removeElement(i);
} else if (!selectedNodes.contains(i)) {
selectedNodes = new Vector<Integer>();
selectedNodes.add(i);
}
if (me.getClickCount() == 2) {
nodes.get(i).setValue("");
editingNode = i;
}
break;
}
}
if (i == nodes.size())
if (!me.isControlDown())
selectedNodes = new Vector<Integer>();
repaint();
}

public void mouseReleased (MouseEvent me) {
addingParent = -2;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged (MouseEvent me) {
mouseX = me.getX();
mouseY = me.getY();
int i = 0;
for (; i<selectedNodes.size(); i++) {
if (nodes.get(selectedNodes.get(i)).getBounds().contains(mouseX, mouseY))
break;
}
if (i != selectedNodes.size()) {
if (me.isAltDown() && addingParent != -3) {
addingParent = selectedNodes.get(i);
} else {
for (i=0; i<selectedNodes.size(); i++) {
nodes.get(selectedNodes.get(i)).setLocation(nodes.get(selectedNodes.get(i)).getLocation().x + mouseX - tmpX,
nodes.get(selectedNodes.get(i)).getLocation().y + mouseY - tmpY);
}
tmpX = mouseX;
tmpY = mouseY;
}
}
repaint();
}

public void mouseMoved (MouseEvent me) {
mouseX = me.getX();
mouseY = me.getY();
}
});
addKeyListener(new KeyAdapter() {
public void keyTyped (KeyEvent ke) {
if (editingNode != -1) {
if (ke.getKeyCode() == KeyEvent.VK_ENTER)
editingNode = -1;
else
nodes.get(editingNode).setValue(nodes.get(editingNode).getValue().toString()+ke.getKeyChar());
} else if (ke.getKeyCode() == KeyEvent.VK_DELETE) {
for (int i=0; i<selectedNodes.size(); i++)
nodes.remove(selectedNodes.get(i));
}
repaint();
}
});
}

public void paint (Graphics g) {
super.paint(g);
FontMetrics fm = g.getFontMetrics();
if (addingParent > -2) {
String str = "node" + nodes.size();
int width = fm.stringWidth(str);
int height = fm.getHeight();

TreePanelNode pnt = null;
if (addingParent != -1)
pnt = nodes.get(addingParent);

nodes.add(new TreePanelNode(pnt, mouseX-width/2-10, mouseY-height/2-20, width+20, height+40, str));
addingParent = -3;
selectedNodes = new Vector<Integer>();
selectedNodes.add(nodes.size()-1);
}
for (int i=0; i<nodes.size(); i++) {
String str = nodes.get(i).getValue().toString();
int width = fm.stringWidth(str);
int height = fm.getHeight();
nodes.get(i).setSize(width + 20, height + 40);

if (selectedNodes.contains(i))
g.setColor(Color.RED);
else
g.setColor(Color.BLACK);

if (nodes.get(i).getParent() != null)
g.drawLine(nodes.get(i).getLocation().x+nodes.get(i).getWidth()/2,
nodes.get(i).getLocation().y+nodes.get(i).getHeight()/2,
nodes.get(i).getParent().getLocation().x+nodes.get(i).getParent().getWidth()/2,
nodes.get(i).getParent().getLocation().y+nodes.get(i).getParent().getHeight()/2);

g.drawString(str, nodes.get(i).getLocation().x + 10, nodes.get(i).getLocation().y + 20);
g.drawRect(nodes.get(i).getLocation().x, nodes.get(i).getLocation().y, nodes.get(i).getWidth(), nodes.get(i).getHeight());
}
grabFocus();
}
}

⑤ 求一个动态树源码(基于java

要求做个小程序:先输入两个String:分别是这个二叉树的中序和后序,程序会算出这个树的前序我实在写不出那个递归。。头要想爆了 终止搞定,inorder

⑥ 在vb中如何对树控件treeview进行以下的编程操作,要求给出详细代码

你自己好好分析下TreeView的使用方法。尝试摸索下,否则永远不会精进

⑦ 谁有ASP。net树控件的代码 让俺学习一下吧

现在西安某软件公司工作,对于你提出的问题我大学刚毕业时也是很迷茫,但是我很幸运的是我遇到了我的幸福之星,他是一个非常牛的人。其实C和C 是一个想学编程的最好的入门语言。但是如果你要走这条路的话那你可要准备做好受打击了心里准备了,因为这两门语言的确是很难的,要学的的话你至少要学四到五年才能去做一些东西。它俩都是和底层打交道的,所以要考虑计算机硬件的一些东西。除此之外你还要懂好多的,不过任何事都一样难学肯定是学出山也很牛了,是这样的你可以看看美国微软的程序员不就是搞底层开发的吗?当然对这两门语言你做到这样就可以了。对C你只要把谭浩强《C程序设计》上的每一道题练的很熟就可以了,一定要记得只有你自己编出来才是你的,看懂的永远也不是你的。对于C 它不是练你的编程的逻辑思维的,而是让你有一个面向对象的思想。你要做的是不停的去思考。还有等你学完之后,可试着朝“B/S模式”开发应用发展。当然这只是我的意见。我觉的咱现在还是以挣钱为主,其他的以后再说了,你觉的呢。最后祝你学业有成!好了就给你说到此了。有问题网络见!

⑧ c#列表和树形控件

列表可以用listview控件,如果有多行的话可以用循环,这里只用一行进行说明:
ListViewItem lv = new ListViewItem(); //先实例化
lv.Text =“”; 一行的第一个元素,双引号里面填写元素
lv.SubItems.Add(); 一行的第二个元素,括号号里面填写元素
lv.SubItems.Add(); 一行的第二个元素,括号号里面填写元素,以此类推
listViewname.Items.Add(lv); 将实例化添加到listview里面, listViewname为所用控件的名字

⑨ 求C#下拉树控件

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace UserControls
{
/// <summary>
/// TreeViewComboBox 的摘要说明。
/// </summary>
public class TreeViewComboBox : UserControl
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private Container components = null;

public delegate void EventHandle(TreeNode n);
public event EventHandle AfterSelectedNode;

private bool _allowSelectParentNode = false;

public TreeViewComboBox()
{
this.InitializeComponent();

// Initializing Controls
this.pnlBack = new Panel();
this.pnlBack.BorderStyle = BorderStyle.Fixed3D;
this.pnlBack.BackColor = Color.White;
this.pnlBack.AutoScroll = false;

this.tbSelectedValue = new TextBox();
this.tbSelectedValue.BorderStyle = BorderStyle.None;
this.tbSelectedValue.ReadOnlyChanged += new EventHandler(tbSelectedValue_ReadOnlyChanged);

this.btnSelect = new ButtonEx();
this.btnSelect.Click += new EventHandler(ToggleTreeView);
this.btnSelect.FlatStyle = FlatStyle.Flat;

this.lblSizingGrip = new LabelEx();
this.lblSizingGrip.Size = new Size(9,9);
this.lblSizingGrip.BackColor = Color.Transparent;
this.lblSizingGrip.Cursor = Cursors.SizeNWSE;
this.lblSizingGrip.MouseMove += new MouseEventHandler(SizingGripMouseMove);
this.lblSizingGrip.MouseDown += new MouseEventHandler(SizingGripMouseDown);

this.tvTreeView = new TreeView();
this.tvTreeView.BorderStyle = BorderStyle.None;
this.tvTreeView.DoubleClick += new EventHandler(TreeViewNodeSelect);
this.tvTreeView.Location = new Point(0,0);
this.tvTreeView.LostFocus += new EventHandler(TreeViewLostFocus);
//this.tvTreeView.Scrollable = false;

this.frmTreeView = new Form();
this.frmTreeView.FormBorderStyle = FormBorderStyle.None;
this.frmTreeView.BringToFront();
this.frmTreeView.StartPosition = FormStartPosition.Manual;
this.frmTreeView.ShowInTaskbar = false;
this.frmTreeView.BackColor = SystemColors.Control;

this.pnlTree = new Panel();
this.pnlTree.BorderStyle = BorderStyle.FixedSingle;
this.pnlTree.BackColor = Color.White;

SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.ResizeRedraw,true);

// Adding Controls to UserControl
this.pnlTree.Controls.Add(this.lblSizingGrip);
this.pnlTree.Controls.Add(this.tvTreeView);
this.frmTreeView.Controls.Add(this.pnlTree);
this.pnlBack.Controls.AddRange(new Control[]{btnSelect, tbSelectedValue});
this.Controls.Add(this.pnlBack);
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// ComboBoxTree
//
this.Name = "ComboBoxTree";
// this._ = true;
this.Layout += new LayoutEventHandler(this.ComboBoxTree_Layout);

}
#endregion

#region Private 属性
private Panel pnlBack;
private Panel pnlTree;
private TextBox tbSelectedValue;
private ButtonEx btnSelect;
private TreeView tvTreeView;
private LabelEx lblSizingGrip;
private Form frmTreeView;

// private string _branchSeparator;
// private bool _;
private Point DragOffset;
#endregion

#region Public 属性

/// <summary>
/// 是否允许选择非叶子节点
/// </summary>
public bool AllowSelectParentNode
{
set
{
_allowSelectParentNode = value;
}
get
{
return _allowSelectParentNode;
}
}

public Color TextForeColor
{
set { this.tbSelectedValue.ForeColor = value; }
}

public Color TextBackColor
{
set { this.tbSelectedValue.BackColor = value; }
}

/// <summary>
/// 文本只读属性
/// </summary>
public bool TextReadOnly
{
set { this.tbSelectedValue.ReadOnly = value; }
}

/// <summary>
/// 树节点集合
/// </summary>
public TreeNodeCollection Nodes
{
get
{
return this.tvTreeView.Nodes;
}
}

/// <summary>
/// 选中的节点
/// </summary>
public TreeNode SelectedNode
{
set
{
this.tvTreeView.SelectedNode = value;
}
get
{
return this.tvTreeView.SelectedNode;
}
}

/// <summary>
/// ImageList
/// </summary>
public ImageList Imagelist
{
get {return this.tvTreeView.ImageList;}
set {this.tvTreeView.ImageList = value;}
}

/// <summary>
/// 显示选中的值
/// </summary>
public override string Text
{
get {return this.tbSelectedValue.Text;}
set {this.tbSelectedValue.Text = value;}
}

// /// <summary>
// /// 显示完整树节点路径时,路经的分隔符(1位字符)
// /// </summary>
// public string BranchSeparator
// {
// get {return this._branchSeparator;}
// set
// {
// if(value.Length > 0)
// this._branchSeparator = value.Substring(0,1);
// }
// }
//
// /// <summary>
// /// 是否是叶子节点
// /// </summary>
// public bool
// {
// get {return this._;}
// set {this._ = value;}
// }
#endregion

/// <summary>
/// 拖动树背景,改变背景大小
/// </summary>
private void RelocateGrip()
{
this.lblSizingGrip.Top = this.frmTreeView.Height - lblSizingGrip.Height - 1;
this.lblSizingGrip.Left = this.frmTreeView.Width - lblSizingGrip.Width - 1;
}

/// <summary>
/// 点击三角按钮,显示树Form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ToggleTreeView(object sender, EventArgs e)
{
if(!this.frmTreeView.Visible)
{
Rectangle CBRect = this.RectangleToScreen(this.ClientRectangle);
this.frmTreeView.Location = new Point(CBRect.X, CBRect.Y + this.pnlBack.Height);
this.tvTreeView.Nodes[0].Expand();
this.frmTreeView.Show();
this.frmTreeView.BringToFront();

this.RelocateGrip();
//this.tbSelectedValue.Text = "";
}
else
{
this.frmTreeView.Hide();
}
}

/// <summary>
/// 验证选中的是否是叶子节点
/// </summary>
/// <returns></returns>
// public bool ValidateText()
// {
// string ValidatorText = this.Text;
// TreeNodeCollection TNC = this.tvTreeView.Nodes;
//
// for(int i = 0; i < ValidatorText.Split(this._branchSeparator.ToCharArray()[0]).Length; i++)
// {
// bool NodeFound = false;
// string NodeToFind = ValidatorText.Split(this._branchSeparator.ToCharArray()[0])[i];
// for(int j = 0; j < TNC.Count; j++)
// {
// if(TNC[j].Text == NodeToFind)
// {
// NodeFound = true;
// TNC = TNC[j].Nodes;
// break;
// }
// }
//
// if(!NodeFound)
// return false;
// }
//
// return true;
// }

#region 事件
/// <summary>
/// 改变背景大小,在鼠标移动时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SizingGripMouseMove(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
int TvWidth, TvHeight;
TvWidth = Cursor.Position.X - this.frmTreeView.Location.X;
TvWidth = TvWidth + this.DragOffset.X;
TvHeight = Cursor.Position.Y - this.frmTreeView.Location.Y;
TvHeight = TvHeight + this.DragOffset.Y;

if(TvWidth < 50)
TvWidth = 50;
if(TvHeight < 50)
TvHeight = 50;

this.frmTreeView.Size = new Size(TvWidth, TvHeight);
this.pnlTree.Size = this.frmTreeView.Size;
this.tvTreeView.Size = new Size(this.frmTreeView.Size.Width - this.lblSizingGrip.Width, this.frmTreeView.Size.Height - this.lblSizingGrip.Width);;
RelocateGrip();
}
}

/// <summary>
/// 改变背景大小,在按下鼠标时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SizingGripMouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
int OffsetX = Math.Abs(Cursor.Position.X - this.frmTreeView.RectangleToScreen(this.frmTreeView.ClientRectangle).Right);
int OffsetY = Math.Abs(Cursor.Position.Y - this.frmTreeView.RectangleToScreen(this.frmTreeView.ClientRectangle).Bottom);

this.DragOffset = new Point(OffsetX, OffsetY);
}
}

/// <summary>
/// 树型控件失去焦点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeViewLostFocus(object sender, EventArgs e)
{
if(!this.btnSelect.RectangleToScreen(this.btnSelect.ClientRectangle).Contains(Cursor.Position))
this.frmTreeView.Hide();
}

/// <summary>
/// 选中树型空间节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeViewNodeSelect(object sender, EventArgs e)
{
if(this._allowSelectParentNode && this.tvTreeView.SelectedNode != this.tvTreeView.Nodes[0])
{
this.tbSelectedValue.Text = this.tvTreeView.SelectedNode.Text;

this.ToggleTreeView(sender,null);

AfterSelectedNode(this.tvTreeView.SelectedNode);
}
else
{
if(this.tvTreeView.SelectedNode.Nodes.Count == 0)
{
this.tbSelectedValue.Text = this.tvTreeView.SelectedNode.Text;

this.ToggleTreeView(sender,null);

AfterSelectedNode(this.tvTreeView.SelectedNode);
}
}
}

private void ComboBoxTree_Layout(object sender, LayoutEventArgs e)
{
this.Height = this.tbSelectedValue.Height + 8;
this.pnlBack.Size = new Size(this.Width, this.Height - 2);

this.btnSelect.Size = new Size(16, this.Height - 6);
this.btnSelect.Location = new Point(this.Width - this.btnSelect.Width - 4, 0);

this.tbSelectedValue.Location = new Point(2, 2);
this.tbSelectedValue.Width = this.Width - this.btnSelect.Width - 4;
this.frmTreeView.Size = new Size(this.Width + 60, 250);
this.pnlTree.Size = this.frmTreeView.Size;
this.tvTreeView.Width = this.frmTreeView.Width - this.lblSizingGrip.Width;
this.tvTreeView.Height = this.frmTreeView.Height - this.lblSizingGrip.Width;
this.RelocateGrip();
}

/// <summary>
/// 文本只读事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tbSelectedValue_ReadOnlyChanged(object sender, EventArgs e)
{
if(this.tbSelectedValue.ReadOnly)
{
this.tbSelectedValue.BackColor = Color.White;
}
}
#endregion

#region 树型背景Label
private class LabelEx : Label
{
/// <summary>
///
/// </summary>
public LabelEx()
{
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
}

/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawSizeGrip(e.Graphics,Color.Black, 1, 0, this.Size.Width, this.Size.Height);
}
}
#endregion

#region 三角形按钮
private class ButtonEx : Button
{
ButtonState state;

/// <summary>
///
/// </summary>
public ButtonEx()
{
this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle(ControlStyles.DoubleBuffer,true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);

}
/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnMouseDown(MouseEventArgs e)
{
state = ButtonState.Pushed;
base.OnMouseDown(e);
}

/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnMouseUp(MouseEventArgs e)
{
state = ButtonState.Normal;
base.OnMouseUp(e);
}

/// <summary>
///
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawComboButton(e.Graphics, 0, 0, this.Width, this.Height, state);
}
}
#endregion

}

}

⑩ 有没有现成的C#.net关于树形结构的代码或控件。

树形结构的控件有,但只有插入,编辑,删除的功能.
调序得自己写方法```

热点内容
传奇脚本刷怪 发布:2024-10-06 11:57:47 浏览:261
c语言输入小写输出大写 发布:2024-10-06 11:49:57 浏览:361
金立手机服务器异常是什么原因 发布:2024-10-06 11:49:48 浏览:699
python多线程假的 发布:2024-10-06 11:37:09 浏览:723
自己动手构造编译 发布:2024-10-06 11:35:11 浏览:550
c语言编译器win10 发布:2024-10-06 11:33:35 浏览:971
安卓手机里的自动备份是什么 发布:2024-10-06 11:30:16 浏览:714
想买电脑配置要注意哪些 发布:2024-10-06 11:21:50 浏览:541
滴滴云存储 发布:2024-10-06 11:17:37 浏览:767
精通android游戏开发 发布:2024-10-06 11:16:54 浏览:801