2008-12-09 21 views

Respuesta

2

Hice algo similar a eso recientemente, y utilicé un ListBox. Lo bueno de un cuadro de lista es que puedes mostrarlo donde quieras, incluso fuera de los límites de tu control. De esta forma, cuando detecte mediante un clic de un botón o lo que sea, que necesita mostrar el DropDown que desea, simplemente llene el ListBox y muéstrelo en cualquier lugar que desee. Tengo la idea de aquí:

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

Ellos muestran cómo construir un DataGridView personalizado con el filtrado, y para visualizar los valores de filtro, se coloca un cuadro de lista debajo de la celda de cabecera.

7

Windows Forms no es compatible con windows así, es básicamente incompatible con el diseñador. Aquí hay un código para comenzar. No puede usar este control en el diseñador, debe crearse en tiempo de ejecución. También debe llamar a su método Dispose() usted mismo.

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

Lo intenté y funciona muy bien, pero de alguna manera no genera eventos ListBox como DrawItem y SelectedIndexChanged. ¿Tienes alguna idea de por qué? –

+0

Vea mi respuesta aquí: http://stackoverflow.com/questions/398176/listbox-with-overriden-createparams-doesnt-raise-item-events#398694 –

Cuestiones relacionadas