コンテキスト メニューがアクティブになっているツリー リスト内のノードを確認するにはどうすればよいですか? たとえば、ノードを右クリックして、メニューからオプションを選択します。
SelectedNode
ノードが右クリックされただけで選択されていないため、TreeViews のプロパティを使用できません。
コンテキスト メニューがアクティブになっているツリー リスト内のノードを確認するにはどうすればよいですか? たとえば、ノードを右クリックして、メニューからオプションを選択します。
SelectedNode
ノードが右クリックされただけで選択されていないため、TreeViews のプロパティを使用できません。
TreeViewにマウスクリックイベントを追加し、MouseEventArgsによって提供されるマウス座標を指定してGetNodeAtを使用して正しいノードを選択できます。
void treeView1MouseUp(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
// Select the clicked node
treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
if(treeView1.SelectedNode != null)
{
myContextMenuStrip.Show(treeView1, e.Location);
}
}
}
これが私の解決策です。この行を TreeView の NodeMouseClick イベントに挿入します。
((TreeView)sender).SelectedNode = e.Node;
標準の Windows ツリービュー動作の選択動作は非常に煩わしいと思います。たとえば、Explorer を使用している場合、ノードを右クリックして [プロパティ] をクリックすると、ノードが強調表示され、クリックしたノードのプロパティ ダイアログが表示されます。ただし、ダイアログから戻ると、強調表示されたノードは、右クリックする前に以前に選択/強調表示されていたノードでした。正しいノードで行動したかどうかについて私は永遠に混乱しているため、これがユーザビリティの問題を引き起こしていることがわかりました.
そのため、多くの GUI では、混乱がないように、選択したツリー ノードを右クリックで変更します。これは、Explorer のような標準の iwndos アプリと同じではないかもしれません (そして、使いやすさの理由から、標準のウィンドウ アプリの後に GUI の動作を強くモデル化する傾向があります)。
右クリック時に選択を変更するコードを次に示します。
private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
// only need to change selected note during right-click - otherwise tree does
// fine by itself
if ( e.Button == MouseButtons.Right )
{
Point pt = new Point( e.X, e.Y );
tree.PointToClient( pt );
TreeNode Node = tree.GetNodeAt( pt );
if ( Node != null )
{
if ( Node.Bounds.Contains( pt ) )
{
tree.SelectedNode = Node;
ResetContextMenu();
contextMenuTree.Show( tree, pt );
}
}
}
}
私はこれがはるかに良い解決策であると思うので、この質問を復活させます。NodeMouseClick
代わりにイベントを使用します。
void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if( e.Button == MouseButtons.Right )
{
tree.SelectedNode = e.Node;
}
}
マーカスの答えと同様に、これは私がうまくいった解決策でした。
private void treeView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView.SelectedNode = treeView.GetNodeAt(e.Location);
}
}
次のように個々のノードに設定する場合は、コンテキストメニューを自分で表示する必要はありません。
TreeNode node = new TreeNode();
node.ContextMenuStrip = contextMenu;
次に、ContextMenuのOpeningイベント内で、TreeView.SelectedNodeプロパティが正しいノードを反映します。
実行できる別のオプションは、選択したノードを持つグローバル変数を持つことです。を使用するだけですTreeNodeMouseClickEventArgs
。
public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e)
{
_globalVariable = e.Node;
}
これで、そのノードとそのプロパティにアクセスできるようになりました。
コンテキスト メニューを選択した項目に依存させたい場合は、Jonesinator のコードを使用してクリックした項目を選択するのが最善の方法だと思います。コンテキスト メニューのコンテンツは、選択した項目に依存することができます。
コンテキスト メニューに使用するのではなく、最初に項目を選択すると、いくつかの利点があります。1 つ目は、ユーザーがどの項目をクリックしたか、つまりメニューがどの項目に関連付けられているかを視覚的に示すことです。2 つ目は、この方法により、コンテキスト メニューを呼び出す他の方法 (キーボード ショートカットなど) との互換性を維持することが非常に簡単になることです。