2009-11-13 41 views
1

前我寫一個用戶控件,將有點像一個下拉列表,基本上是與它的下方彈出一個列表框的文本框...保持一個窗口中的另一個

如果控制是在底部的父窗體,我不希望列表框被窗體底部剪切,所以從我收集我不能將這個列表框作爲父窗體的子窗體..我需要創建一個新的無邊界窗體包含列表框並將其顯示在正確的位置。

我可以做到這一點很好,問題出現在整理出窗體的z順序。我需要這種新形式始終出現在父表單之上。但我不希望這個窗口出現在父窗體上方的任何窗口上面......這是設置form.TopMost會給我的。

有沒有其他方法可以做到這一點? ComboBoxes如何設法實現這種行爲?

感謝

回答

5

當你調用form.Show(),通過在用戶控件的所有者(當前的形式)爲所有者參數。這段代碼並不完美,但你會明白。

class MyControl : UserControl 
{ 
    private DropDownForm form = new DropDownForm(); 

    public MyControl() 
    { 
     form.FormClosed += dropdownform_closed; 
    } 

    private void MethodThatShowsDropdown() 
    { 
     form.AddData(GetTheData()); 
     form.Show(this.Owner); // Or is it "this.Parent"? I can never remember... 
    } 

    private void dropdownform_closed(object sender, EventArgs e) 
    { 
     DoSomething(form.SelectedValue); 
    } 
} 
+1

此外,您可以在窗體上設置Owner屬性,以防直接由您的代碼顯示。 – Marek 2009-11-13 14:57:57

+0

當我運行這段代碼時,表單剛好出現並消失。爲什麼不只是'(新的DropDownForm())。Show(this)'? – jheddings 2009-11-13 15:00:49

+0

Eek - 哎呀。表格正在立即處理(因此關閉)。我會改變這個例子... – 2009-11-13 15:02:00

0

我不知道這是否會爲您的應用程序工作,但使用ShowDialog(),以顯示你的「名單表」將保持在正確的地方。缺點是它不會允許您在列表打開時返回父窗體。

0

您應該只需要在調用ShowModalDialog或Show時提供父窗體。當你這樣做時,表格是第一個孩子,並且會一直按z順序重疊。