트리 목록에서 컨텍스트 메뉴가 활성화된 노드를 찾으려면 어떻게 해야 하나요? 예를 들어 노드를 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 옵션을 선택하면 됩니다.
노드를 마우스 오른쪽 버튼으로 클릭했을 뿐 선택하지 않았기 때문에 TreeViews의 SelectedNode
속성을 사용할 수 없습니다.
트리뷰에 마우스 클릭 이벤트를 추가한 다음 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);
}
}
}
표준 윈도우 트리뷰 동작 선택 동작이 상당히 성가신 것 같습니다. 예를 들어 탐색기를 사용 중이고 노드를 마우스 오른쪽 버튼으로 클릭하고 속성을 누르면 노드가 강조 표시되고 클릭한 노드의 속성 대화 상자가 표시됩니다. 그러나 대화 상자에서 돌아왔을 때 강조 표시된 노드는 마우스 오른쪽 버튼을 클릭하기 전에 이전에 선택/강조한 노드입니다. 이로 인해 올바른 노드를 클릭했는지 계속 헷갈리기 때문에 사용성 문제가 발생합니다.
그래서 많은 GUI에서 마우스 오른쪽 버튼을 클릭하면 선택한 트리 노드를 변경하여 혼동을 방지합니다. 익스플로러와 같은 표준 윈도우 앱과 같지는 않겠지만(저는 사용 편의성을 위해 표준 윈도우 앱을 따라 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 );
}
}
}
}
이것은 매우 오래된 질문, 그래도 여전히 유용한 그것을 발견했다. 나는, 내가 don& 일부 답을 조합하여 t # 39 위, other tabs 노드입니다 다운로드하려는 셀레스테드노데 된다. 나는 루트 노드 중 하나를 선택하여 삭제할 경우, s, t 자 don& 하였더뇨 it& # 39, 내가 선택한 이 삭제하시겠습니까 # 39 다운로드하려는 when I (I am 또한 하는 일부 작업을 제가 하는 일이 싶지 않다, 셀레스테드노데 don& # 39 에서 마우스 오른쪽 버튼 클릭). 이것은 내 기여:
// Global Private Variable to hold right-clicked Node
private TreeNode _currentNode = new TreeNode();
// Set Global Variable to the Node that was right-clicked
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
_currentNode = e.Node;
}
// Do something when the Menu Item is clicked using the _currentNode
private void toolStripMenuItem_Clicked(object sender, EventArgs e)
{
if (_currentNode != null)
MessageBox.Show(_currentNode.Text);
}
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;
컨텍스트 메뉴가 선택한 항목에 따라 달라지도록 하려면 Jonesinator의 코드를 사용하여 클릭한 항목을 선택하는 것이 가장 좋습니다. 그러면 컨텍스트 메뉴 콘텐츠가 선택한 항목에 따라 달라질 수 있습니다.
컨텍스트 메뉴에 사용하는 대신 항목을 먼저 선택하면 몇 가지 이점이 있습니다. 첫 번째는 사용자가 어떤 항목을 클릭했는지, 따라서 메뉴가 어떤 항목과 연관되어 있는지 시각적으로 알 수 있다는 것입니다. 두 번째는 이렇게 하면 상황에 맞는 메뉴를 호출하는 다른 방법(예: 키보드 단축키)과 호환성을 유지하는 것이 훨씬 쉬워진다는 것입니다.