2011-04-01 4 views
4

コンボボックスの値の変更を無効にする方法はありますか?私はいくつかの記事を見ましたが、それらはWPF用であり、私の状況を助けませんでした。WinFormsでコンボボックスを無効にすることはできますか?

+0

変更を拒否したい場合は、適切なメソッドを処理してください。 –

+2

コンボボックスは正常に見えますが、ユーザーはそのコンボボックスと対話できません。この利用不可能な状態にあることをユーザーにどのように示すつもりですか? –

+3

これは本当に悪い考えです。コンボボックスをグレイアウトすると、ユーザーが無効になっていることがわかり、変更できなくなります。 *使用可能に見えるが、編集しようとするユーザーの試行を無視するコンボボックスは紛らわしいものではない。私はそのインターフェイスを壊れた**と呼ぶだろう。 –

答えて

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; 

場合は何らかの理由でラムダを使用することはできません。その後、ハンドラを関連付けることができます。 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

マウスを使用するとどうなりますか? –

+0

何も、何もマウスで変更することはできません。 –

+0

後で再度有効にするにはどうすればよいですか? – MBU

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のメソッドと - =それらのメソッドを使用します。 –

+0

または、 'e.Handled = someBoolVar'を使用してください。ここでsomeBoolVarの状態は有効/無効です。 –

+0

DropDownHeightの高さをリセットするにはどうすればよいですか?私は最初に高さを保管すべきですか?それを私が再び有効にしたいときにリセットしますか? – MBU

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に設定するよりもはるかに良い解決策です。 –

+0

Beep()を忘れました。 –

+0

このコントロールを有効にすると、再び有効に設定されます。このコードはnullである 'fake'を破棄しようとします。例外をスローします。次に灰色に見えますが、有効なコンボのように見える場合は、テーマの変更を処理する必要があります。 –

関連する問題