保留下拉列表

时间:2013-02-28 14:55:26

标签: c# .net winforms combobox

我想禁用combobox,但同时我想让用户看到其他可用选项(也就是说,我想启用dropdown)。

默认情况下,当ComboBox.Enabled = false时,dropdown也会被停用(点击combobox时没有任何反应)。

我的第一个想法是启用它并处理ComboBox.SelectedIndex event将其设置回默认值(我只需要以某种方式将其灰显。)

我想知道是否存在我缺少的任何本机功能,或者是否有其他方法可以执行此操作。

4 个答案:

答案 0 :(得分:4)

如果您不想使用Combobox功能,请不要使用Combobox。改为使用ListView。

答案 1 :(得分:1)

“你看到的是你无法得到的”Combobox似乎是一个坏主意。 我建议改用ListBox。

答案 2 :(得分:0)

这是一个 hacky 解决方法,但它应该完成类似于您的请求:

public partial class Form1 : Form
{
    ComboBox _dummy;

    public Form1()
    {
        InitializeComponent();

        // set the style
        comboBox1.DropDownStyle = 
            System.Windows.Forms.ComboBoxStyle.DropDownList;
        // disable the combobox
        comboBox1.Enabled = false;

        // add the dummy combobox
        _dummy = new ComboBox();
        _dummy.Visible = false;
        _dummy.Enabled = true;
        _dummy.DropDownStyle = ComboBoxStyle.DropDownList;
        this.Controls.Add(_dummy);

        // add the event handler
        MouseMove += Form1_MouseMove;
    }

    void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        var child = this.GetChildAtPoint(e.Location);
        if (child == comboBox1)
        {
            if (!comboBox1.Enabled)
            {
                // copy the items
                _dummy.Items.Clear();
                object[] items = new object[comboBox1.Items.Count];
                comboBox1.Items.CopyTo(items, 0);
                _dummy.Items.AddRange(items);

                // set the size and position
                _dummy.Left = comboBox1.Left;
                _dummy.Top = comboBox1.Top;
                _dummy.Height = comboBox1.Height;
                _dummy.Width = comboBox1.Width;

                // switch visibility
                comboBox1.Visible = !(_dummy.Visible = true);
            }
        }
        else if (child != _dummy)
        {
            // switch visibility
            comboBox1.Visible = !(_dummy.Visible = false);
        }
    }
}

答案 3 :(得分:0)

如果使用ListBox作为其他建议的答案不方便。有一种方法可以创建自定义组合框并添加ReadOnly属性。试试这段代码:

class MyCombo : System.Windows.Forms.ComboBox
{
    public bool ReadOnly { get; set; }
    public int currentIndex;

    public MyCombo()
    {
        currentIndex = SelectedIndex ;
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        if (ReadOnly && Focused)
            SelectedIndex = currentIndex;

        currentIndex = SelectedIndex;

        base.OnSelectedIndexChanged(e);
    }

}

通常,只读控件的背景颜色不应该改变,所以我没有做过那部分。