2011-01-03 5 views
3

MouseClick 트리 뷰 컨트롤의 이벤트를 사용할 때 항상 트리의 첫 번째 노드가 선택됩니다. 사용자가 선택한 현재 노드를 가져 오려면 어떻게해야합니까? C#을 사용하고 있습니다. TreeView 컨트롤에서 현재 노드를 선택하려면 어떻게합니까?

내가 현재 사용하고있는 코드입니다 : 사전에

private void TVRecorder_MouseClick(object sender, MouseEventArgs e) 
{ 
    TreeNode selectedNode = TVRecorder.HitTest(e.Location).Node; 
    if (selectedNode != null) 
    { 
     if (selectedNode.SelectedImageKey == "Test_Space") 
     { 
      frmRepository rep = new frmRepository(); 
      string ssql = string.Empty; 
      rep.label1.Text = "Scenario-RepositoryDetails"; 
      rep.LoadAppSettings(); 
      SqlConnection con4 = new SqlConnection(); 

      con4.ConnectionString = "Data Source=" + rep.ScnServer + ";" + "initial catalog=" + rep.ScnDbName + ";" + "User Id=" + rep.ScnUserName + ";" + "Password=" + rep.ScnPwd; 
      try 
      { 
       con4.Open(); 
      } 
      catch 
      { 
       MessageBox.Show("Connection Failed"); 
      } 
      ssql = "scn_select_testplan_sp"; 
      SqlCommand cmd = new SqlCommand(ssql, con4); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@testspace_key", SqlDbType.Int); 
      cmd.Parameters["@testspace_key"].Value = testspace_key; 
      SqlDataReader _datareader = cmd.ExecuteReader(); 
      try 
      { 
       while (_datareader.Read()) 
       { 
        testplan_key = (int)_datareader["testplan_key"]; 
        testplan_desc = (string)_datareader["testplan_desc"]; 
        //selectedNode.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan"); 
        TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan"); 
        TVRecorder.Visible = true; 
        TVRecorder.HideSelection = false; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

감사합니다 ...

+0

'WPF' 또는'WinForms'? 일부 코드도 넣으십시오. – decyclone

+0

그것은 윈도우 양식 응용 프로그램입니다 .... – vikasse

답변

5

당신이 사용할 수있는 마우스의 위치와 관련하여 TreeView 제어에 의해 노출 HitTest method 포인터 MouseClick 이벤트가 발생했을 때 (e.Location) 어떤 노드가 클릭되었는지 (따라서 이벤트가 끝날 때 선택되어 나타납니다) 확인할 수 있습니다. 위의 코드 검사가 selectedNode 그것으로 무엇을하기 전에 null이 아닌지 확인하는 것이

private void TreeView_MouseClick(object sender, MouseEventArgs e) 
{ 
    // Get the node that was clicked 
    TreeNode selectedNode = myTreeView.HitTest(e.Location).Node; 

    if (selectedNode != null) 
    { 
     // ... 
     // Do something with the selected node here... 
    } 
} 

공지 예를 ​​들면 다음과 같습니다. 사용자가 이 아닌 노드를 노드를 클릭하면 selectedNode 개체는 HitTest 메서드로 검색되며 null이됩니다.

TreeView 컨트롤의 SelectedNode property을 사용 중이므로 지금은 효과가 없을 것입니다. MouseClick 이벤트 처리기 메서드의 코드가 실행 중일 때 노드가 아직 선택되지 않았습니다. 코드가 실행 된 이후에만 이 선택됩니다. 대신 위의 방법을 사용하면 노드에서 최종적으로보다 직접적으로 선택 될 수 있습니다. 당신의 갱신에 관한하고 아래에 의견을


편집 :

이것은 간단한 수정처럼 나에게 보인다. 문제는 코드의이 라인에서 발생

TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan"); 

위의 코드는 TreeView에 나타나는 첫 번째 노드의 자식으로 새로운 노드를 추가합니다. 대신, 당신이 그들을 선택된 노드의 자식으로 추가하기를 원하는 것으로 보입니다. 당신은 이미 선택된 노드 (답의 위 부분 참조) 어떤 결정했습니다, 그래서 당신은 너무처럼 선택된 노드의 자식으로 새로운 노드를 추가하는 코드를 수정해야합니다

selectedNode.Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan"); 

기억 모든 노드 (TreeNode class의 인스턴스)는 TreeNodeCollection을 노출하는 Nodes property을가집니다. 이 콜렉션은 해당 노드의 모든 하위 노드를 보유합니다.

Nodes 속성이 다른 TreeNode 개체의 수집을 저장할 수 : MSDN 아마 내가 할 수있는 것보다이 더 나은 설명합니다. 컬렉션의 트리 노드 [s] 각각 속성은 에 TreeNodeCollection을 포함 할 수 있습니다. 트리 노드의이 중첩은 트리 구조를 탐색하기 어렵게 만들 수 있습니다. FullPath 속성을 사용하면 트리에서 내 위치를 쉽게 확인할 수 있습니다.

+0

고마워 코드 그레이 ...하지만 여전히 내가 선택한 노드를 얻을 수 오전 problen 가지고 있지만 내가 자식 노드를 삽입하면 첫 번째 노드에 삽입되면 가져옵니다 노드에서 내가 selcted.This 코드를 사용하고 있습니다 .... – vikasse

+0

@vikasse : 귀하의 질문을 수정하여 코멘트를 추가하는 대신 사용중인 코드를 게시하십시오. 주석은 코드 하이라이트 나 줄 바꿈을 얻지 못합니다! 아무도 그것을 읽고 싶어하지 않습니다. ;-) –

+0

k ... 내 질문을 편집했습니다 ... – vikasse

관련 문제