0

異なるレベルの TreeNodes を持つ TreeView があります。
同じ ContextMenuStrip をすべての親 TreeNodes に追加しました。その 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

これは、クリシュナクマールのコードよりもはるかに明確で簡単だと思います。「toolStripMenuDeleteAll」を一部のツリーノードのみに設定でき、すべてのノードには設定できません。このコードは、Selected TreeNode をまったく変更しません。

ようこそチャダッシュ

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 に答える
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 でクリック イベントを設定して、選択したノードに基づいてすべての子ノードを削除できます。

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 に答える