Можно ли отключить комбинированный список в WinForms, не выпуская его? - PullRequest
4 голосов
/ 01 апреля 2011

Есть ли способ отключить изменение значения для поля со списком, не скрывая его в формах Windows?Я видел несколько постов, но они были для WPF и не помогли моей ситуации.

Ответы [ 4 ]

6 голосов
/ 01 апреля 2011

Установка этих параметров на вашем comobobox сделает то, что вам нужно, Combo включен, но никто не может ничего изменить или напечатать, поэтому Appearance = Enabled, Behavior = Disabled :)

        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 голосов
/ 01 апреля 2011

Нет, не достаточно хорошо.Сделайте его отключенным и посмотрите точно как оригинал, чтобы пользователь был полностью обманут.Добавьте новый класс и вставьте этот код.

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 голосов
/ 01 апреля 2011

В ручке GotFocus (как бы это ни называлось), установите фокус на что-то другое.

0 голосов
/ 01 апреля 2011

Затем сохраните его обработчики как переменные и просто - = их после.

Пример:

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;
...