如何在winforms中制作Combobox readonly

Kis*_*e A 54 .net c# winforms

我不希望用户能够更改组合框中显示的值.我一直在使用,Enabled = false但它会使文本变灰,所以它不是很易读.我希望它的行为像文本框一样ReadOnly = true,文本正常显示,但用户无法编辑它.

有没有办法实现这个?

小智 150

make DropDownStyle属性DropDownList而不是DropDown 处理TextChanged事件以防止用户更改文本.

  • 为什么这不是正确的答案?快速,简单,不会重新发明轮子. (15认同)
  • 这不会阻止用户仅通过编辑文本来选择不同的选项. (10认同)
  • 这可能不是正确答案,但对于我们中的56位(在撰写本文时),这是我们正在寻找的答案(如何禁用编辑文本.) (7认同)
  • 我认为对于大多数情况来说,这个解决方案比公认的解决方案更好。谢谢你! (2认同)

小智 19

文章组合框与-只读行为提出了一个有趣的解决方案:

在同一个地方创建只读文本框和组合框.当您想要只读模式时,显示文本框,当您希望它可编辑时,显示组合框.

  • 被否决的原因是:这个答案并不是很有用。正如@amar vashi 指出的那样,标准组合框控件已经提供了所需的功能。 (4认同)

Dan*_*ams 11

不确定这是不是你想要的但是......

设置DropDownStyle = DropDownList

然后在SelectedIndexChanged事件上

If (ComboBox1.SelectedIndex <> 0)
{
    ComboBox1.SelectedIndex = 0
}
Run Code Online (Sandbox Code Playgroud)

这个丑陋的部分是他们会"感觉"他们可以改变它.他们可能认为这是一个错误,除非你给他们一个警告,告诉他们为什么他们不能改变价值.


Mar*_*ell 9

我可以建议的最好的事情是用只读文本框(或者只是标签)替换组合框 - 这样用户仍然可以选择/复制值等.

当然,另一个厚脸皮的策略是设置DropDownStyleDropDownList,并删除所有其他选项 - 然后用户没有别的选择;-p


Vir*_*rus 8

在此输入链接描述

只需更改DropDownStyleDropDownList.或者如果你想要它完全只读你可以设置Enabled = false,或者如果你不喜欢它的外观我有时有两个控件,一个只读文本框和一个组合框然后隐藏组合并显示文本框是否应该完全只读反之亦然.


Man*_*ish 5

这是只读组合的最佳解决方案。

private void combo1_KeyPress(object sender, KeyPressEventArgs e)
{
    e.KeyChar = (char)Keys.None;
}
Run Code Online (Sandbox Code Playgroud)

它将丢弃组合的按键。


Nia*_*all 5

我已经通过继承 ComboBox 添加一个 ReadOnly 属性来处理它,该属性在设置时隐藏自己并在顶部显示一个包含相同文本的 ReadOnly TextBox:

class ComboBoxReadOnly : ComboBox
{
    public ComboBoxReadOnly()
    {
        textBox = new TextBox();
        textBox.ReadOnly = true;
        textBox.Visible = false;
    }

    private TextBox textBox;

    private bool readOnly = false;

    public bool ReadOnly
    {
        get { return readOnly; }
        set
        {
            readOnly = value;

            if (readOnly)
            {
                this.Visible = false;
                textBox.Text = this.Text;
                textBox.Location = this.Location;
                textBox.Size = this.Size;
                textBox.Visible = true;

                if (textBox.Parent == null)
                    this.Parent.Controls.Add(textBox);
            }
            else
            {
                this.Visible = true;
                this.textBox.Visible = false;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)