2011-04-01 62 views
4

有没有一种方法来禁用组合框的值更改而不使它在Windows窗体中灰显?我看到了一些帖子,但他们是WPF的,并没有帮助我的情况。我可以禁用WinForms中的组合框而不使它灰色吗?

+0

如果您只想拒绝更改 - 然后处理相应的方法并执行此操作。 – 2011-04-01 00:03:12

+2

所以你想要一个看起来很正常的组合框,但用户无法与之交互?你打算如何向用户表明它处于这种不可用的状态? – 2011-04-01 00:14:06

+3

这是一个非常糟糕的主意。灰显组合框是用户知道它被禁用并且不能修改它的方式。一个组合框* *启用,但忽略用户尝试编辑它,这是一个令人困惑的问题。我会打电话给那个界面**破碎**。 – 2011-04-01 00:16:48

回答

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; 

如果你因为某些原因不能使用lambdas,那么以下处理程序可以关联。右击 - >粘贴必须额外处理,如果你有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; 
    //} 
+0

如果我使用鼠标会发生什么? – 2011-04-01 01:00:27

+0

什么也没有,用鼠标也没有什么可改变的。 – 2011-04-01 01:01:24

+0

我该如何重新启用它? – MBU 2011-04-01 01:58:35

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

它不像使用var那样简单,使用Sanjeevakumar的方法和 - =那些。 – 2011-04-01 02:28:02

+0

或者使用'e.Handled = someBoolVar',其中someBoolVar的状态为enabled/disabled。 – 2011-04-01 02:31:11

+0

我该如何重置DropDownHeight的高度?我最初应该储存高度吗?并重置它,当我想重新启用? – MBU 2011-04-01 02:46:18

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上获得的非常轻微的'辉光'是非常有趣的。

+0

哈哈,太棒了。尽管这是荒谬的,但它仍然是一个比将DropDownHeight设置为0更好的解决方案。 – 2011-04-01 03:46:12

+0

我忘记了Beep(),已更正。 – 2011-04-01 03:51:20

+0

当此控件启用时,尝试再次启用设置。此代码试图处置'虚假',它是空的。并抛出异常。其次,它仍然看起来很灰,任何主题变化都必须处理,如果它看起来像一个启用组合。 – 2011-04-01 05:50:36

相关问题