有关TreeView的问题 最简单的方法就是传递一个标记变量,每次点击节点时标记tag复位1否则为0而Contextmenu是否有效就是通过tag来标记 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给个例子做参考:源码转摘(不错的例子)TreeView.aspx<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %><HTML> <HEAD> <title>TreeView控件右键菜单</title> <style> <!-- .skin { cursor:default; font:menutext; position:absolute; text-align:left; font-family: Arial, Helvetica, sans-serif; font-size: 10pt; width:120px; background-color:menu; border:1 solid buttonface; visibility:hidden; border:2 outset buttonhighlight; } .menuitems { padding-left:15px; padding-right:10px; } --> </style> </HEAD> <body onclick="hideMenu()"> <form id="TreeView" method="post" runat="server"> <iewc:TreeView id="TreeView1" runat="server" ExpandLevel="3" HoverStyle="color:blue;background:#ffff00;"> <iewc:TreeNode Text="Node0" Expanded="True"> <iewc:TreeNode Text="Node3"> <iewc:TreeNode Text="Node5"></iewc:TreeNode> <iewc:TreeNode Text="Node6"></iewc:TreeNode> </iewc:TreeNode> <iewc:TreeNode Text="Node4"></iewc:TreeNode> </iewc:TreeNode> <iewc:TreeNode Text="Node1" Expanded="True"> <iewc:TreeNode Text="Node7"> <iewc:TreeNode Text="Node8"></iewc:TreeNode> </iewc:TreeNode> </iewc:TreeNode> <iewc:TreeNode Text="Node2" Expanded="True"> <iewc:TreeNode Text="Node9"></iewc:TreeNode> <iewc:TreeNode Text="Node10"> <iewc:TreeNode Text="Node11"></iewc:TreeNode> <iewc:TreeNode Text="Node12"></iewc:TreeNode> </iewc:TreeNode> </iewc:TreeNode> </iewc:TreeView> <div id="popupMenu" class="skin" onMouseover="highlighItem()" onMouseout="lowlightItem()" onClick="clickItem()"> <div class="menuitems" func="add">添加</div> <hr> <div class="menuitems" func="delete">删除</div> <div class="menuitems" func="modify">修改</div> </div> </form> <script language="javascript"> var menuskin = "skin"; var node = null; function hideMenu() { popupMenu.style.visibility = "hidden"; } function highlighItem() { if (event.srcElement.className == "menuitems") { event.srcElement.style.backgroundColor = "highlight"; event.srcElement.style.color = "white"; } } function lowlightItem() { if (event.srcElement.className == "menuitems") { event.srcElement.style.backgroundColor = ""; event.srcElement.style.color = "black"; window.status = ""; } } function clickItem() { if (event.srcElement.className == "menuitems") { if(event.srcElement.getAttribute("func") == "add" && node != null) { var newNode=TreeView1.createTreeNode(); newNode.setAttribute("Text","new Node"); node.add(newNode); } else if (event.srcElement.getAttribute("func") == "delete" && node != null) { node.remove(); } else if (event.srcElement.getAttribute("func") == "modify" && node != null) { node.setAttribute("Text","hgknight"); } } } function TreeView1.oncontextmenu() { var nodeIndex = event.treeNodeIndex; if (typeof(nodeIndex) == "undefined") { node = null; return false; } node = TreeView1.getTreeNode(nodeIndex); var rightedge = document.body.clientWidth-event.clientX; var bottomedge = document.body.clientHeight-event.clientY; if (rightedge <popupMenu.offsetWidth) { popupMenu.style.left = document.body.scrollLeft + event.clientX - popupMenu.offsetWidth; } else { popupMenu.style.left = document.body.scrollLeft + event.clientX; } if (bottomedge <popupMenu.offsetHeight) { popupMenu.style.top = document.body.scrollTop + event.clientY - popupMenu.offsetHeight; } else { popupMenu.style.top = document.body.scrollTop + event.clientY; } popupMenu.style.visibility = "visible"; return false; } </script> </body></HTML> 可以使用treeview的MouseDown事件:private void treeViewRack_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){ if(e.Button ==MouseButtons.Right) { //当在treeview节点点击右键时调用 .............................. }} 用TreeView构建树型目录(C#版) 参与了一个大型社区程序的开发,现在将相关开发经验陆续总结出来,和大家探讨一下。本节内容主要主要讨论的是用TreeView生成无限级分类的树型目录的问题,相关代码摘录自社区程序中的一个文章发布管理系统中的目录管理部分。一、数据库设计BBS_BestArticleFolder 精华区目录表 Key: FolderID Field name Type Length Default Description FolderID int 4 ID(自动编号) ParentFolderID int 4 0 父目录ID FolderName Nvarchar 80 目录名 BoardID int 4 0 版块ID CreaterUserID int 4 0 创建者ID AddTime DateTime 8 GetDate() 创建时间 二、树型目录构建过程1、安装TreeView控件,我想大多数人都是会安装的,不会安装的去找相关文章一下下。2、具体实现:a 数据生成 #region 树的数据生成事件 private DataView CreateDateView(int boardID) { BBSBestArticleFolderCollection bafc=new BBSBestArticleFolderCollection(); bafc.GetInfoByParentFolderID(boardID,-1); int bafcCount=bafc.Count; DataTable dt = new DataTable("table"); dt.Columns.Add("FolderID",System.Type.GetType("System.String")); dt.Columns.Add("FolderName",System.Type.GetType("System.String")); dt.Columns.Add("ParentFolderID",System.Type.GetType("System.String")); for(int i=0;i<bafcCount;i++) { DataRow dr=dt.NewRow(); dr[0]=bafc[i].ID; dr[1]=bafc[i].FolderName; dr[2]=bafc[i].ParentFolderID; dt.Rows.Add(dr); } dv=dt.DefaultView; return dv; } #endregion一点说明:BBSBestArticleFolderCollection对象是个集合类,里面存储了所有符合条件的数据集合,GetInfoByParentFolderID是其中的一个方法,根据一定条件填充集合类的,此文主要讲TreeView构建树型目录,此处会在另外的文章中详述。 b #region TreeView节点生成方法 private void CreateTree(TreeNodeCollection folderTreeNodeCollection ,int parentID) { dv.RowFilter= "ParentFolderID="+parentID; int tmpParentFolderID=0; foreach(DataRowView drv in dv) { TreeNode tn=new TreeNode(); tn.ID=drv.Row["FolderID"].ToString(); tn.Text=drv.Row["FolderName"].ToString().Trim(); tmpParentFolderID=Int32.Parse(drv.Row["ParentFolderID"].ToString().Trim()); //tn.CheckBox=true; folderTreeNodeCollection.Add(tn); CreateTree(folderTreeNodeCollection[folderTreeNodeCollection.Count - 1].Nodes,Int32.Parse(tn.ID)); } }一点解释:递归构建树的各级节点,其中的dv就是上一个方法生成的DataViewc 取得数据的方法有了,生节节点的方法也有了,那么剩下的就是调用了 CreateTree(TreeView1.Nodes,0);一点解释:TreeView1是控件ID,这个大家都知道吧,这里的0其实就是表示顶级目录,从顶级目录递归调用下去DI。 private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){ if ( e.Button == System.Windows.Forms.MouseButtons.Right ) { TreeNode tn = treeView1.GetNodeAt( e.X,e.Y ); if ( tn != null ) { treeView1.SelectedNode = tn; this.contextMenu1.Show(treeView1,new Point(e.X,e.Y )); } }} 根据ItemData的数据类型来判断就可以了啊! private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){ if (e.Button == MouseButtons.Right) { TreeNode treeNode = this.treeView1.GetNodeAt(e.X, e.Y); if (treeNode != null) { this.treeView1.SelectedNode = treeNode; this.treeView1.ContextMenu = this.contextMenu1; } else this.treeView1.ContextMenu = null; }}注:不要给treeview1的ContextMenu属性附初值。 分两种1.设置了TreeView的ContextMenu属性private void treeViewCatalog_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){ TreeView tv = (TreeView)sender; if(e.Button == MouseButtons.Right) { TreeNode tn = tv.GetNodeAt(e.X,e.Y) as TreeNode; if(tn!=null) { tv.SelectedNode = tn; //this.ctMenuTreeView.Show(tv,new Point(e.X,e.Y)); } }}2,没有设置。加上this.ctMenuTreeView.Show(tv,new Point(e.X,e.Y)); 基于POP3协议收发邮件系统 C#人事管理系统怎么做 【在线求救】Fill方法的使用是否有限制或注意事项【SQLite.net中的SQLiteDataAdapter类里的方法】 求算法 在文本文件中删除一行 前辈们推荐几本初学C#的书吧! 如何为datagrid增加一个空行 关于用VS中自带的可视化数据集更新数据库时遇到的数据回滚问题 asp.net多字段查询条件怎么写 一个窗体关闭事件的问题 一个转换的奇怪的问题啊 怎么看窗体已经显示?
TreeView.aspx<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<HTML>
<HEAD>
<title>TreeView控件右键菜单</title>
<style>
<!--
.skin
{
cursor:default;
font:menutext;
position:absolute;
text-align:left;
font-family: Arial, Helvetica, sans-serif;
font-size: 10pt;
width:120px;
background-color:menu;
border:1 solid buttonface;
visibility:hidden;
border:2 outset buttonhighlight;
}
.menuitems
{
padding-left:15px;
padding-right:10px;
}
-->
</style>
</HEAD>
<body onclick="hideMenu()">
<form id="TreeView" method="post" runat="server">
<iewc:TreeView id="TreeView1" runat="server" ExpandLevel="3" HoverStyle="color:blue;background:#ffff00;">
<iewc:TreeNode Text="Node0" Expanded="True">
<iewc:TreeNode Text="Node3">
<iewc:TreeNode Text="Node5"></iewc:TreeNode>
<iewc:TreeNode Text="Node6"></iewc:TreeNode>
</iewc:TreeNode>
<iewc:TreeNode Text="Node4"></iewc:TreeNode>
</iewc:TreeNode>
<iewc:TreeNode Text="Node1" Expanded="True">
<iewc:TreeNode Text="Node7">
<iewc:TreeNode Text="Node8"></iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeNode>
<iewc:TreeNode Text="Node2" Expanded="True">
<iewc:TreeNode Text="Node9"></iewc:TreeNode>
<iewc:TreeNode Text="Node10">
<iewc:TreeNode Text="Node11"></iewc:TreeNode>
<iewc:TreeNode Text="Node12"></iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeNode>
</iewc:TreeView>
<div id="popupMenu" class="skin" onMouseover="highlighItem()" onMouseout="lowlightItem()" onClick="clickItem()">
<div class="menuitems" func="add">添加</div>
<hr>
<div class="menuitems" func="delete">删除</div>
<div class="menuitems" func="modify">修改</div>
</div>
</form>
<script language="javascript">
var menuskin = "skin";
var node = null; function hideMenu()
{
popupMenu.style.visibility = "hidden";
} function highlighItem()
{
if (event.srcElement.className == "menuitems")
{
event.srcElement.style.backgroundColor = "highlight";
event.srcElement.style.color = "white";
}
} function lowlightItem()
{
if (event.srcElement.className == "menuitems")
{
event.srcElement.style.backgroundColor = "";
event.srcElement.style.color = "black";
window.status = "";
}
} function clickItem()
{
if (event.srcElement.className == "menuitems")
{
if(event.srcElement.getAttribute("func") == "add" && node != null)
{
var newNode=TreeView1.createTreeNode();
newNode.setAttribute("Text","new Node");
node.add(newNode);
}
else if (event.srcElement.getAttribute("func") == "delete" && node != null)
{
node.remove();
}
else if (event.srcElement.getAttribute("func") == "modify" && node != null)
{
node.setAttribute("Text","hgknight");
}
}
}
function TreeView1.oncontextmenu()
{
var nodeIndex = event.treeNodeIndex;
if (typeof(nodeIndex) == "undefined")
{
node = null;
return false;
}
node = TreeView1.getTreeNode(nodeIndex);
var rightedge = document.body.clientWidth-event.clientX;
var bottomedge = document.body.clientHeight-event.clientY;
if (rightedge <popupMenu.offsetWidth)
{
popupMenu.style.left = document.body.scrollLeft + event.clientX - popupMenu.offsetWidth;
}
else
{
popupMenu.style.left = document.body.scrollLeft + event.clientX;
}
if (bottomedge <popupMenu.offsetHeight)
{
popupMenu.style.top = document.body.scrollTop + event.clientY - popupMenu.offsetHeight;
}
else
{
popupMenu.style.top = document.body.scrollTop + event.clientY;
}
popupMenu.style.visibility = "visible";
return false;
}
</script>
</body>
</HTML>
private void treeViewRack_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(e.Button ==MouseButtons.Right)
{
//当在treeview节点点击右键时调用
..............................
}
}
参与了一个大型社区程序的开发,现在将相关开发经验陆续总结出来,和大家探讨一下。本节内容主要主要讨论的是用TreeView生成无限级分类的树型目录的问题,相关代码摘录自社区程序中的一个文章发布管理系统中的目录管理部分。一、数据库设计BBS_BestArticleFolder 精华区目录表
Key: FolderID
Field name
Type
Length
Default
Description
FolderID
int
4
ID(自动编号)
ParentFolderID
int
4
0
父目录ID
FolderName
Nvarchar
80
目录名
BoardID
int
4
0
版块ID
CreaterUserID
int
4
0
创建者ID
AddTime
DateTime
8
GetDate()
创建时间
二、树型目录构建过程1、安装TreeView控件,我想大多数人都是会安装的,不会安装的去找相关文章一下下。2、具体实现:a 数据生成 #region 树的数据生成事件 private DataView CreateDateView(int boardID) { BBSBestArticleFolderCollection bafc=new BBSBestArticleFolderCollection(); bafc.GetInfoByParentFolderID(boardID,-1); int bafcCount=bafc.Count; DataTable dt = new DataTable("table"); dt.Columns.Add("FolderID",System.Type.GetType("System.String")); dt.Columns.Add("FolderName",System.Type.GetType("System.String")); dt.Columns.Add("ParentFolderID",System.Type.GetType("System.String")); for(int i=0;i<bafcCount;i++) { DataRow dr=dt.NewRow(); dr[0]=bafc[i].ID; dr[1]=bafc[i].FolderName; dr[2]=bafc[i].ParentFolderID; dt.Rows.Add(dr); } dv=dt.DefaultView; return dv; } #endregion一点说明:BBSBestArticleFolderCollection对象是个集合类,里面存储了所有符合条件的数据集合,GetInfoByParentFolderID是其中的一个方法,根据一定条件填充集合类的,此文主要讲TreeView构建树型目录,此处会在另外的文章中详述。 b #region TreeView节点生成方法 private void CreateTree(TreeNodeCollection folderTreeNodeCollection ,int parentID) { dv.RowFilter= "ParentFolderID="+parentID; int tmpParentFolderID=0; foreach(DataRowView drv in dv) { TreeNode tn=new TreeNode(); tn.ID=drv.Row["FolderID"].ToString(); tn.Text=drv.Row["FolderName"].ToString().Trim(); tmpParentFolderID=Int32.Parse(drv.Row["ParentFolderID"].ToString().Trim()); //tn.CheckBox=true; folderTreeNodeCollection.Add(tn); CreateTree(folderTreeNodeCollection[folderTreeNodeCollection.Count - 1].Nodes,Int32.Parse(tn.ID)); } }一点解释:递归构建树的各级节点,其中的dv就是上一个方法生成的DataViewc 取得数据的方法有了,生节节点的方法也有了,那么剩下的就是调用了 CreateTree(TreeView1.Nodes,0);一点解释:TreeView1是控件ID,这个大家都知道吧,这里的0其实就是表示顶级目录,从顶级目录递归调用下去DI。
{
if ( e.Button == System.Windows.Forms.MouseButtons.Right )
{
TreeNode tn = treeView1.GetNodeAt( e.X,e.Y );
if ( tn != null )
{
treeView1.SelectedNode = tn;
this.contextMenu1.Show(treeView1,new Point(e.X,e.Y ));
}
}
}
{
if (e.Button == MouseButtons.Right)
{
TreeNode treeNode = this.treeView1.GetNodeAt(e.X, e.Y);
if (treeNode != null)
{
this.treeView1.SelectedNode = treeNode;
this.treeView1.ContextMenu = this.contextMenu1;
}
else
this.treeView1.ContextMenu = null;
}
}
注:不要给treeview1的ContextMenu属性附初值。
1.设置了TreeView的ContextMenu属性
private void treeViewCatalog_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
TreeView tv = (TreeView)sender;
if(e.Button == MouseButtons.Right)
{
TreeNode tn = tv.GetNodeAt(e.X,e.Y) as TreeNode;
if(tn!=null)
{
tv.SelectedNode = tn;
//this.ctMenuTreeView.Show(tv,new Point(e.X,e.Y));
}
}
}
2,没有设置。
加上this.ctMenuTreeView.Show(tv,new Point(e.X,e.Y));