2008-12-09 51 views

回答

2

我最近做了類似的事情,我用了一個ListBox。酷想一個列表框,就是你可以在任何你想要的地方顯示它,甚至超出你的控制範圍。這樣,當您通過按鈕點擊或任何其他方式檢測到時,您需要顯示所需的DropDown,只需填充ListBox並將其顯示在您想要的任何位置。我的想法從這裏:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

他們展示如何建立一個自定義的DataGridView與篩選,並顯示過濾器值,他們將一個列表框的標題單元格下。

7

Windows窗體不支持這樣的窗口,它與設計器基本上是不兼容的。這裏有一些代碼讓你開始。你不能在設計器中使用這個控件,它必須在運行時創建。你也必須自己調用它的Dispose()方法。

using System; 
using System.Drawing; 
using System.ComponentModel; 
using System.Windows.Forms; 

public class MyListBox : ListBox { 
    private Control mParent; 
    private Point mPos; 
    private bool mInitialized; 

    public MyListBox(Control parent) { 
    mParent = parent; 
    mInitialized = true; 
    this.SetTopLevel(true); 
    parent.LocationChanged += new EventHandler(parent_LocationChanged); 
    mPos = mParent.Location; 
    } 

    public new Point Location { 
    get { return mParent.PointToClient(this.Location); } 
    set { 
     Point zero = mParent.PointToScreen(Point.Empty); 
     base.Location = new Point(zero.X + value.X, zero.Y + value.Y); 
    } 
    } 

    protected override Size DefaultSize { 
    get { 
     return mInitialized ? base.DefaultSize : Size.Empty; 
    } 
    } 

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { 
    if (this.mInitialized) 
     base.SetBoundsCore(x, y, width, height, specified); 
    } 

    void parent_LocationChanged(object sender, EventArgs e) { 
    base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y); 
    mPos = mParent.Location; 
    } 

    protected override CreateParams CreateParams { 
    get { 
     CreateParams cp = base.CreateParams; 
     if (mParent != null && !DesignMode) { 
     cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000); 
     cp.Parent = mParent.Handle; 
     Point pos = mParent.PointToScreen(Point.Empty); 
     cp.X = pos.X; 
     cp.Y = pos.Y; 
     cp.Width = base.DefaultSize.Width; 
     cp.Height = base.DefaultSize.Height; 
     } 
     return cp; 
    } 
    } 
} 
+0

嘗試了它,它工作得很好,但不知何故它不會像DrawItem和SelectedIndexChanged一樣引發ListBox事件。你有什麼想法,爲什麼? – 2008-12-29 17:29:23

相關問題