2012-10-11 46 views
1

我有一個文本框和一個列表框,我希望列表框僅在文本框或列表框處於關注狀態時纔可見。從列表框開始將不可見。然後當文本框被關注時,列表框應該是可見的。只有在丟失焦點並且沒有收到它的情況下,列表框纔會再次變得不可見。所以我想實現的是下面在任何時候都爲真:檢測哪個控件是活動的

listBox.Visible = textBox.Focused || listBox.Focused

在我的解決方案文本框和/或列表框可以是標準型的專業化(如果這簡化了解決方案) 。

我試着在兩個控件LostFocus和GotFocus事件上進行偵聽,並設置了列表框的可見性。然而GotFocus事件在列表框中從來沒有被調用,因爲當文本框失去焦點時我將它變爲不可見。

有沒有人有如何做到這一點的建議?我的備份計劃(我不喜歡)是當一個人失去焦點時啓動一個計時器,如果另一個人獲得焦點,則啓動計時器。所以一個「乾淨」的方式來實現它將不勝感激;)

編輯:我正在開發這個被用作.NET WinForms自定義控件。

編輯2:

看來,我沒有解釋自己相當受用。所以我會試着解釋我想要更明確地達到什麼。

我在創建一個新的TextBox類型(繼承幾年前構建的現有類型的TextBox)。 TextBox目前作爲一個通用的集合(包括實現IList的子類型)的對象。 TextBox定義了一個ListBox,它根據一組標準顯示集合中元素的一個子集。當TextBox被添加到父控件時,ListBox也是如此。因此,這兩個工作可以作爲搜索元素蒐集的一種設置。與開始鍵入時瀏覽器提供建議時的排序相同。

我使用此設置而不是包含兩個控件的UserControl,因爲後者將導致用戶控件是兩個控件的大小或(當大小與TextBox匹配時)ListBox不可見。

我意識到我可以選擇處理添加此控件的窗體中的所有控件上的GotFocus或Enter事件。這是我想到的一個非常直接的方法,但我更願意編寫一個控件,它不會在窗體中的每個其他控件上進行監聽。

我希望這個澄清。

回答

0

您可以做的是在窗體上添加一個Enter事件處理程序到所有其他控件。

private void OtherControls_Enter(object sender, EventArgs e) 
{ 
    listBox.Visible = false; 
} 

編輯:
例子是的WinForms,但應與WPF藏漢工作。

如果自定義控件只包含TextBoxListBox那麼你的事件添加到TextBox設置ListBox可見:

private void textBox1_Enter(object sender, EventArgs e) 
{ 
    listBox1.Visible = true; 
} 

如果有其他控件添加了OtherControls_Enter事件處理他們。

在自定義控件的Leave事件添加類似:

private void userControl11_Leave(object sender, EventArgs e) 
{ 
    userControl11.Controls["listbox1"].Visible = false; 
} 

編輯2:
更妙的是從自定義控件內暴露ListBox

public ListBox TheListBox { get { return listBox1; } } 

然後:

private void userControl11_Leave(object sender, EventArgs e) 
{ 
    userControl11.TheListBox.Visible = false; 
} 
+0

我的這種方法唯一的問題是我開發一個自定義的控制(我也許應該提到的),因此我會必須爲所有控件添加處理程序,因爲此自定義控件已添加到窗體或面板中。添加/刪除所有這些處理程序的過程(包括向表單添加/刪除控件時)將很快導致一系列事件。另外,沒有任何其他類型的處理程序被添加到控件中。 – DeadDog

+0

此外,沒有「OnFocus」事件。我認爲你的意思是「GotFocus」事件,並且你的事件處理程序是正確命名的。 – DeadDog

+0

你使用什麼技術? WPF? ASP.NET?的WinForms?自定義控件包含什麼?只有TextBox和ListBox? –

0

將所有控件的Control_Enter事件實現爲集中式,並檢查發件人對象是否爲您的文本框或列表框,然後列表框將顯示爲不可見。

像這樣

this.button1.Enter += new System.EventHandler(this.Control_Enter); 
    this.textBox1.Enter += new System.EventHandler(this.Control_Enter); 
    this.listBox1.Enter += new System.EventHandler(this.Control_Enter); 

private void Control_Enter(object sender, EventArgs e) 
    { 
     Control obj = (Control)sender; 
     if (obj.Name == "textBox1" || obj.Name == "listBox1") 
     { 
      listBox1.Visible = true; 
     } 
     else 
     { 
      listBox1.Visible = false; 
     } 
    } 

不要忘記分配控制選項卡索引