usar - Cómo crear un control C#Winforms que se cierne
user control c# ejemplo (3)
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, complete el ListBox y muéstrelo a cualquier lugar que desee. Tengo la idea desde aquí:
http://msdn.microsoft.com/en-us/library/aa480727.aspx
Muestran cómo construir un DataGridView personalizado con filtrado, y para mostrar los valores de filtro, colocan un ListBox debajo de la celda del encabezado.
¿Cómo se puede crear un control C # Winforms que salga de los límites de su región? Como un cuadro desplegable. Algo así como si tuviera un DropDownBox en un Panel de Tamaño Pequeño.
Windows Forms no es compatible con ventanas como esa, 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;
}
}
}
Hay un buen artículo aquí:
http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp
Tiene una clase que maneja algunos de los aspectos complicados de hacer que esto funcione correctamente, como mantener activa la barra de título de la ventana de la aplicación, manejar Alt-Tab y cancelar con un clic del mouse.