Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使下拉菜单处于启用状态_C#_.net_Winforms_Combobox - Fatal编程技术网

C# 使下拉菜单处于启用状态

C# 使下拉菜单处于启用状态,c#,.net,winforms,combobox,C#,.net,Winforms,Combobox,我想禁用组合框,但同时我想让用户看到其他可用选项(即,我想启用下拉列表) 默认情况下,当ComboBox.Enabled=false时,下拉列表也会被禁用(单击组合框时不会发生任何事情) 我的第一个想法是让它保持启用状态,并处理组合框。SelectedIndex事件将其设置回默认值(我只需要以某种方式将其灰显) 我想知道是否有任何像这样的本机功能是我所缺少的,或者是否有其他方法可以做到这一点。如果您不想要Combobox功能,请不要使用Combobox。请改用列表视图。如果不需要组合框功能,请不

我想禁用
组合框
,但同时我想让用户看到其他可用选项(即,我想启用
下拉列表

默认情况下,当
ComboBox.Enabled=false
时,
下拉列表也会被禁用(单击
组合框时不会发生任何事情)

我的第一个想法是让它保持启用状态,并处理
组合框。SelectedIndex事件
将其设置回默认值(我只需要以某种方式将其灰显)


我想知道是否有任何像这样的本机功能是我所缺少的,或者是否有其他方法可以做到这一点。

如果您不想要Combobox功能,请不要使用Combobox。请改用列表视图。

如果不需要组合框功能,请不要使用组合框。改用列表视图。

使用“所见即所得”组合框似乎是个坏主意。 我建议改为使用列表框。

一个“你看到的是你得不到的”组合框似乎是个坏主意。 我建议改用ListBox。

这是一个很难解决的问题,但它应该可以实现与您的请求类似的功能:

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);
        }
    }
}
这是一个黑客解决方案,但它应该完成与您的请求类似的工作:

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);
        }
    }
}

如果按照其他答案建议使用
列表框
,则不方便。有一种方法是创建一个自定义组合框并添加一个
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);
    }

}

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

如果像其他答案建议的那样使用
列表框
,是不方便的。有一种方法是创建一个自定义组合框并添加一个
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);
    }

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