max*_*dbe 9 .net c# user-interface user-controls winforms
如何创建超出其区域范围的C#Winforms控件?比如一个下拉框.有点像你在小尺寸面板中有一个DropDownBox.
Windows Forms不支持这样的窗口,它与设计师根本不兼容.这里有一些代码可以帮助您入门.您不能在设计器中使用此控件,它必须在运行时创建.您还必须自己调用其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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最近做了类似的事情,并且使用了 ListBox。列表框的一个很酷的想法是,您可以将其显示在任何您想要的地方,甚至超出您的控制范围。这样,当您通过单击按钮或其他方式检测到需要显示所需的 DropDown 时,只需填充列表框并将其显示在您想要的任何位置即可。我从这里得到了这个想法:
http://msdn.microsoft.com/en-us/library/aa480727.aspx
他们展示了如何构建具有过滤功能的自定义 DataGridView,并在标题单元格下放置一个 ListBox 以显示过滤器值。