2009-12-10 5 views
0

누구든지 내 이유를 아래 코드의 트리에서 트리 노드를 선택할 때 포커스를 잃어 버리게된다고 설명 할 수 있습니까? 트리가 listview 예제와 같이 사라지더라도 폼/버튼에 포커스가 있어야하지만 그렇게하지 않아야합니다.Winforms 및 포커스 문제의 TreeView

코드 예제 : 폼이 포커스를 잃을하지만, 문제는 Controls.Remove(treeView1); 줄 것으로 보인다 이유

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace FocusTest 
{ 
    public partial class Form1 : Form 
    { 
    #region Generated 

    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
     components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("Item1"); 
     System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("Item2"); 
     System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("Item3"); 
     System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Node0"); 
     System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Node1"); 
     System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Node2"); 
     this.button1 = new System.Windows.Forms.Button(); 
     this.listView1 = new System.Windows.Forms.ListView(); 
     this.button2 = new System.Windows.Forms.Button(); 
     this.treeView1 = new System.Windows.Forms.TreeView(); 
     this.SuspendLayout(); 
     // 
     // button1 
     // 
     this.button1.Location = new System.Drawing.Point(12, 12); 
     this.button1.Name = "button1"; 
     this.button1.Size = new System.Drawing.Size(75, 23); 
     this.button1.TabIndex = 0; 
     this.button1.Text = "button1"; 
     this.button1.UseVisualStyleBackColor = true; 
     this.button1.Click += new System.EventHandler(this.button1_Click); 
     // 
     // listView1 
     // 
     this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { 
      listViewItem1, 
      listViewItem2, 
      listViewItem3    
      }); 
     this.listView1.Location = new System.Drawing.Point(12, 41); 
     this.listView1.Name = "listView1"; 
     this.listView1.Size = new System.Drawing.Size(121, 97); 
     this.listView1.TabIndex = 1; 
     this.listView1.UseCompatibleStateImageBehavior = false; 
     this.listView1.Visible = false; 
     this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); 
     this.listView1.View = View.List; 
     // 
     // button2 
     // 
     this.button2.Location = new System.Drawing.Point(310, 11); 
     this.button2.Name = "button2"; 
     this.button2.Size = new System.Drawing.Size(75, 23); 
     this.button2.TabIndex = 2; 
     this.button2.Text = "button2"; 
     this.button2.UseVisualStyleBackColor = true; 
     this.button2.Click += new System.EventHandler(this.button2_Click); 
     // 
     // treeView1 
     // 
     this.treeView1.Location = new System.Drawing.Point(310, 41); 
     this.treeView1.Name = "treeView1"; 
     treeNode1.Name = "Node0"; 
     treeNode1.Text = "Node0"; 
     treeNode2.Name = "Node1"; 
     treeNode2.Text = "Node1"; 
     treeNode3.Name = "Node2"; 
     treeNode3.Text = "Node2"; 
     this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { 
      treeNode1, 
      treeNode2, 
      treeNode3}); 
     this.treeView1.Size = new System.Drawing.Size(121, 97); 
     this.treeView1.TabIndex = 3; 
     this.treeView1.Visible = false; 
     this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(760, 409); 
     this.Controls.Add(this.treeView1); 
     this.Controls.Add(this.button2); 
     this.Controls.Add(this.listView1); 
     this.Controls.Add(this.button1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.ResumeLayout(false); 

    } 

    #endregion 

    private System.Windows.Forms.Button button1; 
    private System.Windows.Forms.ListView listView1; 
    private System.Windows.Forms.Button button2; 
    private System.Windows.Forms.TreeView treeView1; 

    #endregion 


    public Form1() 
    { 
     InitializeComponent(); 
    } 

    #region TreeView 

    private void button2_Click(object sender, EventArgs e) 
    { 
     ToggleTreeView(); 
    } 

    private void ToggleTreeView() 
    { 
     if (treeView1.Visible) 
     { 
     Controls.Remove(treeView1); 
     treeView1.Visible = false; 
     } 
     else 
     { 
     Controls.Add(treeView1); 
     treeView1.Size = new Size(300, 400); 
     treeView1.Location = PointToClient(PointToScreen(new System.Drawing.Point(button2.Location.X, button2.Location.Y + button2.Height))); 
     this.treeView1.BringToFront(); 
     treeView1.Visible = true; 
     treeView1.Select(); 

     } 
    } 

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
    { 
     ToggleTreeView(); 
    } 

    #endregion 

    #region ListView 

    private void button1_Click(object sender, EventArgs e) 
    { 
     ToggleListView(); 
    } 

    private void ToggleListView() 
    { 
     if (listView1.Visible) 
     { 
     Controls.Remove(listView1); 
     listView1.Visible = false; 
     } 
     else 
     { 
     Controls.Add(listView1); 
     listView1.Size = new Size(300, 400); 
     listView1.Location = PointToClient(PointToScreen(new System.Drawing.Point(button1.Location.X, button1.Location.Y + button1.Height))); 
     this.listView1.BringToFront(); 
     listView1.Visible = true; 
     listView1.Select(); 
     } 
    } 

    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listView1.Visible) 
     ToggleListView(); 
    } 

    #endregion   
    } 
} 

답변

0

내가 설명 할 수 없다. Controls.RemoveControls.Add 행을 제거하면 문제가 해결 된 것으로 보입니다.

왜 컨트롤 목록에서 treeView를 제거 할 이유가 있습니까? 가시성 플래그를 false으로 설정하면 사용자가 선택한 후에 treeView가 사라집니다.

편집 : 귀하의 코멘트에 대한 응답으로

: 내 생각은 treeView1_AfterSelect를 호출 한 후, 트 리뷰 자체에 포커스를 설정하는 것입니다 것입니다. 양식에서 컨트롤을 제거했기 때문에 코드에서 불가능합니다.

이 이론을 테스트하기 위해, 나는, 타이머를 추가로 코드를 대체 :
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    timer1.Enabled = true; 
    timer1.Start(); 
} 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    ToggleTreeView(); 
    timer1.Stop(); 
    timer1.Enabled = false; 

} 

이 지금은 잘 작동합니다. 그래서 TreeView가 이 AfterSelect 이벤트를 발생시킨 후 호출하고 있다고 생각합니다. (그것은 단지 추측입니다. 어쩌면 다른 사람이 내게 더 많은 것을 알게 될 것입니다.)

ListView에서 작동하는 이유는 listView1_SelectedIndexChanged 이후에 포커스를 설정하지 않기 때문입니다.

+0

그러나 왜리스트 뷰 케이스와 함께 작동합니까? –