在表单外显示列表框(winforms)

时间:2009-05-07 10:46:12

标签: c# winforms

是否有可能让我的列表框显示在表单的边界之外?

其中一个解决方案是使表单本身透明,并添加面板而不是背景的表单。

但还有其他更令人愉快的方法吗?

UPD: 我需要为文本框创建自定义自动完成功能,以支持通配符。所以我想在文本框下面显示一个列表框。我的表单大小应该与文本框的大小相当。所以,在这种情况下,垂直拉伸表格不起作用。

THX

3 个答案:

答案 0 :(得分:8)

实际上,它可能。 这是方式:

public class PopupWindow : System.Windows.Forms.ToolStripDropDown
{
    private System.Windows.Forms.Control _content;
    private System.Windows.Forms.ToolStripControlHost _host;

    public PopupWindow(System.Windows.Forms.Control content)
    {
        //Basic setup...
        this.AutoSize = false;
        this.DoubleBuffered = true;
        this.ResizeRedraw = true;

        this._content = content;
        this._host = new System.Windows.Forms.ToolStripControlHost(content);

        //Positioning and Sizing
        this.MinimumSize = content.MinimumSize;
        this.MaximumSize = content.Size;
        this.Size = content.Size;
        content.Location = Point.Empty;

        //Add the host to the list
        this.Items.Add(this._host);
    }
}


popup = new PopupWindow(listbox1);
PopupWindow.show(); 

答案 1 :(得分:3)

您可以使用包含列表框的第二种形式吗?你需要一些代码来相对于主窗体移动它,但它应该工作...

答案 2 :(得分:1)

不是,不。这与基本的winforms模型背道而驰。你可以用大量的手动修改或互操作作弊,但这几乎不值得花费。

相反,问问自己为什么要这样做。看起来您正在尝试重新实现组合框,其唯一目的是添加自动完成功能。也许您应该简单地对组合框控件进行子类化,以将自动完成功能添加到控件中,该控件可以为您完成所有硬件并且已经存在。

在我目前的工作过程中,我已经看到至少有三种不同的本土组合框,它们都以各种方式被打破,相当于大量的工作而没有真正的回报。我最喜欢的是组合框,其下拉列表框窃取了拥有的表单焦点。看着破碎的代码导致任何使用闪烁代码的东西都很有趣。

编辑:

通过继承ComboBox仍然可以将组合框修改为带通配符的搜索/过滤器,并且仍然比滚动自己的组合框更容易,但在那时我建议考虑更多的appropriate ui范例。组合框不会过滤下拉列表(除非您使用糟糕的软件作为灵感咳嗽 SAP 咳嗽)。