我可以在 WinForms 中禁用组合框而不将其灰显吗?

问题描述 投票:0回答:5

有没有办法禁用组合框的值更改而不将其在 Windows 窗体中灰显?我看到了一些帖子,但它们是针对 WPF 的,对我的情况没有帮助。

c# .net winforms combobox controls
5个回答
6
投票

在您的

comobobox
上设置这些将实现您正在寻找的技巧,组合已启用,但没有人可以更改或键入任何内容,因此外观=启用,行为=禁用:)

        comboBox1.DropDownHeight = 1;
        comboBox1.KeyDown += (s, e) => e.Handled = true;
        comboBox1.KeyPress += (s, e) => e.Handled = true;
        comboBox1.KeyUp += (s, e) => e.Handled = true;

如果由于某种原因您无法使用 lambda,则可以关联以下处理程序。如果您有 DropDownStyle = DropDown,则右键单击 -> 粘贴必须另外处理。

    //void comboBox1_KeyUp(object sender, KeyEventArgs e)
    //{
    //    e.Handled = true;
    //}

    //void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    //{
    //    e.Handled = true;
    //}

    //void comboBox1_KeyDown(object sender, KeyEventArgs e)
    //{
    //    e.Handled = true;
    //}

1
投票

将焦点设置到

Enter
处理程序中的下一个控件,使 ComboBox 完全抵抗点击,这正是我所需要的。

接受的答案中的

comboBox1.DropDownHeight = 1;
显示了一个奇怪的单像素下拉菜单,在我对 UI 敏感的眼睛看来有点破碎。

我发现的唯一缺点是无法在整个字段中使用 Shift-Tab 键,但就我而言,这不是问题。


0
投票

然后将他的处理程序保存为变量,然后简单地 -= 它们。

示例:

var keyDown = (s, e) => e.Handled = true;
var keyPress = (s, e) => e.Handled = true;
var keyUp = (s, e) => e.Handled = true;

然后将他替换为:

comboBox1.KeyDown += keyDown;
comboBox1.KeyPress += keyPress;
comboBox1.KeyUp += keyUp;

然后当你想删除时:

comboBox1.KeyDown -= keyDown;
comboBox1.KeyPress -= keyPress;
comboBox1.KeyUp -= keyUp;

0
投票

在 GotFocus 处理程序(无论它叫什么)中,将焦点设置到其他位置。


0
投票

不,还不够好。将其禁用并看起来“完全”像原来一样,这样用户就完全被愚弄了。添加一个新类并粘贴此代码。 using System; using System.Drawing; using System.Windows.Forms; class FakeComboBox : ComboBox { private PictureBox fake; public new bool Enabled { get { return base.Enabled; } set { if (!this.DesignMode) displayFake(value); base.Enabled = value; } } private void displayFake(bool enabled) { if (!enabled) { fake = new PictureBox(); fake.Location = this.Location; fake.Size = this.Size; var bmp = new Bitmap(fake.Size.Width, fake.Size.Height); this.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); fake.Image = bmp; this.Parent.Controls.Add(fake); fake.BringToFront(); fake.Click += delegate { Console.Beep(); }; } else { this.Parent.Controls.Remove(fake); fake.Dispose(); fake = null; } } }

当您重新启用 Win7 时,它会出现非常轻微的“发光”,这非常有趣。

© www.soinside.com 2019 - 2024. All rights reserved.