0

我有具有不同级别 TreeNodes 的 TreeView
我向所有父 TreeNodes 添加了相同的 ContextMenuStrip,我希望通过打开该 ContextMenuStrip 并按“全部删除”来删除所有子 TreeNodes

private void btn_delete_all_objects_Click(object sender, EventArgs e)
{
    ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; //that way i receive button "Delete all"
    ContextMenuStrip cms = (ContextMenuStrip)tsmi.Owner; //this is ContextMenuStrip where this button...
    TreeView tw = (TreeView)cms.SourceControl; //i can get TreeView :( BUT I NEED TreeNode!
    TreeNode tn = tw.SelectedNode; //bah... if i select some of child nodes, then right click to open menu on parent, selected node is still that child
}

而且我不知道如何获取用户单击以打开菜单的 TreeNode 有
什么想法吗?

4

3 回答 3

4

您可以使用HitTest()树视图中的方法来查找节点,如下所示,

var hitTest = treeView1.HitTest(treeView1.PointToClient(new Point(contextMenuStrip1.Left, contextMenuStrip1.Top)));
if (hitTest.Node != null)
{
    // Place your code to delete nodes
}

或者您可以关注鼠标单击的节点并使用treeView1.SelectedNode属性在菜单项中进行操作。通过这种方式,您可以避免在每个上下文菜单项上使用 HitTest() ...

private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
    var hitTest = treeView1.HitTest(treeView1.PointToClient(e.Location));
    if (hitTest.Node != null)
    {
         treeView1.SelectedNode = hitTest.Node;
    }
}
于 2012-08-27T10:00:58.343 回答
2

目前尚不清楚您要对上面的代码做什么。但是要执行您需要的操作(即右键单击TreeNode并启动特定的ContextMenuStrip),请使用类似的代码

private void customTreeViewSql_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    // Ensure selected node is selected.
    treeView.BeginUpdate();
    this.treeView.SelectedNode = e.Node;
    try
    {
        if (e.Node.Level == 0)
        {
            if (e.Button == MouseButtons.Right)
                contextMenuStripA.Show(MousePosition);
        }
        else if (e.Node.Level == 1)
        {
            if (e.Button == MouseButtons.Right)
                contextMenuStripB.Show(MousePosition);
        }
    }
    finally
    {
        this.treeView.EndUpdate();
    }
}

然后您可以在 ContexMenu 中设置 click 事件,以根据所选内容删除所有子节点

private void toolStripMenuDeleteAll_Click(object sender, EventArgs e)
{
    TreeNode treeNode = this.treeView.SelectedNode;
    foreach (TreeNode n in treeNode.Nodes)
        n.Remove();
}

我希望这有帮助。

于 2012-08-27T10:07:18.190 回答
2

我认为这比 Krishnakumar 的代码清晰易懂。您可以将您的“toolStripMenuDeleteAll”设置为仅一些树节点而不是所有树节点。此代码根本不会更改 Selected TreeNode。

欢迎 CHADASH

TreeNode LastClickedTreeNode;
private void customTreeViewSql_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    // update last treenode clicked.
    LastClickedTreeNode = e.Node;
}

private void toolStripMenuDeleteAll_Click(object sender, EventArgs e)
{
    foreach (TreeNode n in LastClickedTreeNode.Nodes)
        n.Remove();
}
于 2013-06-23T12:41:45.127 回答