2008-12-09 17 views

Antwort

2

Ich habe vor kurzem etwas Ähnliches gemacht, und ich habe eine ListBox verwendet. Der coole Gedanke an eine Listbox ist, dass man sie überall anzeigen kann, auch außerhalb der Kontrolle. Auf diese Weise, wenn Sie über einen Knopfklick oder was auch immer erkennen, dass Sie das gewünschte DropDown anzeigen müssen, füllen Sie einfach die ListBox und zeigen Sie sie überall an. Ich habe die Idee von hier:

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

Sie zeigen, wie eine benutzerdefinierte Datagridview mit Filtern zu bauen, und die Filterwerte angezeigt werden, stellen sie eine List-Box unter dem Header-Zelle.

7

Windows Forms unterstützt Windows nicht so gut, es ist ziemlich grundsätzlich mit dem Designer nicht kompatibel. Hier ist ein Code, mit dem Sie beginnen können. Sie können dieses Steuerelement nicht im Designer verwenden, es muss zur Laufzeit erstellt werden. Sie müssen auch die Dispose() -Methode selbst aufrufen.

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

Versucht es und es funktioniert gut, aber irgendwie löst es keine ListBox Ereignisse wie DrawItem und SelectedIndexChanged. Hast du eine Ahnung warum? –

+0

Siehe meine Antwort hier: http://stackoverflow.com/questions/398176/listbox-with-overriden-createparams-doesnt-raise-item-events#398694 –

Verwandte Themen