关于contextMenu(上下文菜单)的怪问题

netcoder 2004-10-27 10:56:21
一个TreeView 控件,一个contextMenu

想实现这样比较常见的功能:

只有用户用鼠标右键点击(即选择某一节点)树上某一节点时,才弹出菜单

点击数的空白处均不出现菜单
...全文
348 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu123 2004-10-27
  • 打赏
  • 举报
回复
这是我今天写的一个测试用的:
#region TreeView的事件操作
private void OnTreeViewAfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{

switch(e.Node.Text)
{
case "Folder":
MessageBox.Show(this,e.Node.Text);
break;
case "Friend":
str_flag ="f";
break;
case "Relative":
str_flag ="r";
break;
case "":
str_flag="";
break;
default:
str_flag="";
break;
}
}


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

if(e.Button == MouseButtons.Right)
{
switch(str_flag)
{
case "f":
case "r":
this.contextMenu1.Show(this.treeView1,(new Point(e.X,e.Y)));
break;
default:
break;
}

}
}
#endregion
北京的雾霾天 2004-10-27
  • 打赏
  • 举报
回复
添加如下的代码就可以了:
private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (treeView1.GetNodeAt(e.X,e.Y)!=null)
{
this.treeView1.ContextMenu = this.contextMenu1;
}
else
{
this.treeView1.ContextMenu = null;
}
}
jkflyfox 2004-10-27
  • 打赏
  • 举报
回复
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
TreeNode tn = this.treeView1.GetNodeAt(e.X, e.Y);
if (tn != null)
{
this.contextMenu.Show(this.treeView1,e.Location);
}
}
}
hanbinghai 2004-10-27
  • 打赏
  • 举报
回复
在MouseDown事件里
TreeNode tn =this.tree .GetNodeAt(e.X,e.Y) as TreeNode;
if(tn == null)
{
for(int i=0;i<this.tree.ContextMenu.MenuItems.Count;i++)
{
this.tree.ContextMenu.MenuItems[i].Visible = false;
}
return ;
}
else
{
//选中当前节点
this.tree .SelectedNode = tn;
for(int i=0;i<this.tree.ContextMenu.MenuItems.Count;i++)
{
this.tree.ContextMenu.MenuItems[i].Visible = true;
}
}
trnbo 2004-10-27
  • 打赏
  • 举报
回复
You can display a context menu when a user right-clicks on a node by listening to the TreeView's MouseUp event as shown below:

[C#]

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

{

if(e.Button == MouseButtons.Right)

{

Point ClickPoint = new Point(e.X,e.Y);

TreeNode ClickNode = treeView1.GetNodeAt(ClickPoint);

if(ClickNode == null) return;

// Convert from Tree coordinates to Screen coordinates

Point ScreenPoint = treeView1.PointToScreen(ClickPoint);

// Convert from Screen coordinates to Formc coordinates

Point FormPoint = this.PointToClient(ScreenPoint);

// Show context menu

contextmenu.MenuItems.Clear();

contextmenu.MenuItems.Add("Item1");

contextmenu.MenuItems.Add("Item2");

contextmenu.Show(this,FormPoint);

}

}

trnbo 2004-10-27
  • 打赏
  • 举报
回复
http://www.syncfusion.com/FAQ/WinForms/FAQ_c91c.asp#q1097q

Point ClickPoint = new Point(e.X,e.Y);

TreeNode ClickNode = treeView1.GetNodeAt(ClickPoint);

//save ClickNode somewhere
netcoder 2004-10-27
  • 打赏
  • 举报
回复
是不是应该在treeview的mouse_down 事件里判断呢?
如果是,那怎么让contextMenu不弹出来呢?
netcoder 2004-10-27
  • 打赏
  • 举报
回复
帮帮忙吧
netcoder 2004-10-27
  • 打赏
  • 举报
回复
多谢了
结贴
kissallmm 2004-10-27
  • 打赏
  • 举报
回复
private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (treeView1.GetNodeAt(e.X,e.Y)!=null)
{this.treeView1.ContextMenu = this.contextMenu1;}
else{this.treeView1.ContextMenu = null;}
}

heiding 2004-10-27
  • 打赏
  • 举报
回复
同意

110,532

社区成员

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

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

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