2010-11-10 17 views
1

我有這個簡單的代碼,當用戶離開TextBox控件,其中,TreeView控件得到集中:C#的TreeView SetFocus的射擊離開事件兩次

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     this.treeView1.Nodes.Add("A"); 
     this.treeView1.Nodes[0].Nodes.Add("A.A"); 

     this.treeView1.Nodes.Add("B"); 
     this.treeView1.Nodes[0].Nodes.Add("B.A"); 

    } 



    private void textBox1_Leave(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Leave.."); 
     this.treeView1.Focus(); 
    } 
} 

如果我們執行這個代碼Leave事件被觸發兩次:

離開..
離開..

但是,如果我們將焦點設置其他的控制,只有一個離開事件。

這是TreeView的問題嗎?你知道任何解決方法嗎?我們應該向微軟報告嗎?

感謝, RG

回答

0

由於沒有代碼有要連接我猜你這意味着一行代碼,如

textBox1.Leave += new EventHandler(textBox1_Leave); 

設計師做了本次活動將已添加到Form1.designer.cs中,請檢查此文件以確保該行不會多次存在,因爲每次運行此行時都會得到一個事件觸發器,因此如果您運行該行3次離開事件將在您離開文本框時觸發3次!

HTH

單次

+0

我已經檢查過,並且該事件只安裝一次。 – RGil 2010-11-10 15:35:34

3
this.treeView1.Focus(); 

使用Focus()方法這就是所謂的,因爲一個焦點事件,像離開事件處理程序。如果您需要防止焦點更改,請改用驗證事件。設置e.Cancel = true會停止它。

但請注意,對於TreeView來說這樣做不是很合乎邏輯,用戶無法做任何事情來改變控件的狀態。你會陷入用戶。也許這是意圖,確保用戶仍然可以關閉窗口。如果不是,那麼您可能需要FormClosing事件來強制e.Cancel返回false。

+0

小心分享爲什麼? – 2010-11-10 13:54:37

+1

@Joel - 當Enter和Leave被觸發時,聚焦邏輯處於過渡狀態。由於驗證事件,邏輯非常困難,它可以在已經發生的*之後取消焦點更改*。還有更多這樣的工件,使用Validating事件處理程序中的MessageBox引起焦點也會導致問題。當已經有GotFocus和LostFocus時,Enter和Leave的原因就存在了。醜陋的東西。 – 2010-11-10 13:59:07