C# 带清单的组合框

C# 带清单的组合框,c#,combobox,C#,Combobox,如何在C#中使用包含清单的组合框?编辑:我认为这更合适: 我找到了这个链接:希望它能帮上忙。我自己也一直在搞这个。这里是一个控件的小示例,其中包含真正的复选框,而不仅仅是绘制它们。通过这种方式,您可以真正使用CheckBox类提供的所有功能。它将组合框的常规下拉列表替换为继承ToolStripDropDownMenu的自定义下拉列表,ToolStripDropDownMenu允许您向组合框添加实际控件,并解决了每当单击某个项目时下拉列表关闭的问题。很明显,您希望扩展mycombox类以满足您的需

如何在C#中使用包含清单的组合框?

编辑:我认为这更合适:


我找到了这个链接:希望它能帮上忙。

我自己也一直在搞这个。这里是一个控件的小示例,其中包含真正的复选框,而不仅仅是绘制它们。通过这种方式,您可以真正使用CheckBox类提供的所有功能。它将组合框的常规下拉列表替换为继承ToolStripDropDownMenu的自定义下拉列表,ToolStripDropDownMenu允许您向组合框添加实际控件,并解决了每当单击某个项目时下拉列表关闭的问题。很明显,您希望扩展mycombox类以满足您的需要,但这应该是一个很好的起点

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        var mcb = new MyComboBox() { Left = 6, Top = 6 };
        this.Controls.Add(mcb);

        for (int i = 0; i < 20; i++)
        {
            mcb.AddItem("Item " + i.ToString() );
        }
    }
}

public class MyComboBox : ComboBox
{
    private MyDropDown _dropDown;

    public MyComboBox()
    {
        _dropDown = new MyDropDown() { Width = 200, Height = 200 };
    }

    public void AddItem(string text)
    {
        _dropDown.AddControl(new CheckBox() { Text = text });
    }

    public void ShowDropDown()
    {
        if (_dropDown != null)
        {
            _dropDown.Show(this);
        }
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WndUI.WM_REFLECT + WndUI.WM_COMMAND)
        {
            if (WndUI.HIWORD(m.WParam) == WndUI.CBN_DROPDOWN)
            {
                ShowDropDown();
                return;
            }
        }
        base.WndProc(ref m);
    }
}

[ToolboxItem(false)]
public class MyDropDown : ToolStripDropDownMenu
{
    public MyDropDown()
    {
        this.ShowImageMargin = this.ShowCheckMargin = false;
        this.AutoSize = false;
        this.DoubleBuffered = true;
        this.Padding = Margin = Padding.Empty;
    }

    public int AddControl(Control control)
    {
        var host = new ToolStripControlHost(control);
        host.Padding = host.Margin = Padding.Empty;
        host.BackColor = Color.Transparent;
        return this.Items.Add(host);
    }

    public void Show(Control control)
    {
        Rectangle area = control.ClientRectangle;
        Point location = control.PointToScreen(new Point(area.Left, area.Top + area.Height));
        location = control.PointToClient(location);
        Show(control, location, ToolStripDropDownDirection.BelowRight);
        this.Focus();
    }
}

public static class WndUI
{
    public const int
        WM_USER = 0x0400,
        WM_REFLECT = WM_USER + 0x1C00,
        WM_COMMAND = 0x0111,
        CBN_DROPDOWN = 7;

    public static int HIWORD(IntPtr n)
    {
        return HIWORD(unchecked((int)(long)n));
    }

    public static int HIWORD(int n)
    {
        return (n >> 16) & 0xffff;
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
var mcb=new MyComboBox(){Left=6,Top=6};
此.Controls.Add(mcb);
对于(int i=0;i<20;i++)
{
mcb.AddItem(“项目”+i.ToString());
}
}
}
公共类MyComboBox:组合框
{
private MyDropDown\u下拉菜单;
公共邮箱()
{
_dropDown=newmydropdown(){Width=200,Height=200};
}
公共void附加项(字符串文本)
{
_AddControl(新复选框(){Text=Text});
}
公开作废决战下拉列表()
{
如果(_下拉菜单!=null)
{
_下拉列表。显示(此);
}
}
受保护的覆盖无效WndProc(参考消息m)
{
if(m.Msg==WndUI.WM_REFLECT+WndUI.WM_命令)
{
if(WndUI.HIWORD(m.WParam)==WndUI.CBN_下拉列表)
{
ShowDropDown();
返回;
}
}
基准WndProc(参考m);
}
}
[ToolboxItem(假)]
公共类MyDropDown:ToolStripDropDownMenu
{
公共MyDropDown()
{
this.ShowImageMargin=this.ShowCheckMargin=false;
this.AutoSize=false;
this.DoubleBuffered=true;
this.Padding=Margin=Padding.Empty;
}
公共int AddControl(控制)
{
var host=新的ToolStripControlHost(控制);
host.Padding=host.Margin=Padding.Empty;
host.BackColor=Color.Transparent;
返回此.Items.Add(主机);
}
公共无效显示(控制)
{
矩形区域=control.ClientRectangle;
点位置=控制点到屏幕(新点(area.Left,area.Top+area.Height));
位置=控件。指向客户端(位置);
显示(控件、位置、ToolStripDropDownDirection.BelowWright);
这是Focus();
}
}
公共静态类WndUI
{
公共常数
WM_USER=0x0400,
WM_REFLECT=WM_USER+0x1C00,
WM_命令=0x0111,
CBN_下拉菜单=7;
公共静态int-HIWORD(IntPtr-n)
{
返回HIWORD(未选中((int)(long)n));
}
公共静态int-HIWORD(int-n)
{
返回(n>>16)&0xffff;
}
}

什么平台?请提供更多有关您正在寻找的功能的详细信息。到目前为止,您尝试过做什么?我能够呈现带有复选框的下拉列表。但是我需要弄清楚我该怎么做检查/取消检查等。谢谢!你知道我如何让它保持打开状态,这样我就可以检查一些东西,然后关闭它吗?你试过我上面的代码吗?下拉列表将按照您的要求保持打开状态。我不知道如何使用普通的ComboBox下拉列表,所以我继承了一个ToolStripDropDownMenu来创建自己的下拉列表。MyComboBox类使用Windows消息,该消息告诉普通下拉列表要删除,并删除我的。