Только для чтения (но может быть сброшен) ComboBox - PullRequest
3 голосов
/ 27 марта 2011

Я собираюсь создать поле со списком Windows Forms, которое имеет нормальную окраску и позволяет отображать раскрывающийся список, но не позволяет значению измениться.Насколько я могу судить, это не дубликат Как сделать Combobox в winforms доступным только для чтения , так как все советы, как представляется, направлены на отключение интерактивности поля со списком.У меня есть форма, в которой все элементы управления доступны только для чтения, и из-за характера приложения я думаю, что не будет никакого риска, что пользователь запутается, если значение поля со списком не изменится.Я бы хотел, чтобы пользователь мог видеть все возможные значения перечисления, к которому привязано поле со списком.

То, что у меня есть, - довольно плохой хак:

public partial class ReadOnlyComboBox : ComboBox
{
    int prevIndex = -1;

    public ReadOnlyComboBox()
    {
        InitializeComponent();
    }

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (prevIndex <= 0)
            prevIndex = SelectedIndex;
        else
            SelectedIndex = prevIndex;
    }
}

По сути, это игнорирует ложные значения «0» из каркаса и принимает первое ненулевое значение, полученное из источника привязки.Непосредственными недостатками является то, что значение может быть установлено только один раз, и что привязанное перечисление должно начинаться с 1.

Любые рекомендации по очистке этого будут приветствоваться.Спасибо.

1 Ответ

1 голос
/ 29 марта 2011

Использовать событие DropDownClosed

public class ReadOnlyComboBox : ComboBox
{
    bool afterDropDown ;
    int prevIndex;

    public ReadOnlyComboBox()
    {
        this.SelectedIndexChanged+=new EventHandler(ReadOnlyComboBox_SelectedIndexChanged);
        this.DropDownClosed += new EventHandler(ReadOnlyComboBox_DropDownClosed);
    }

    void ReadOnlyComboBox_DropDownClosed(object sender, EventArgs e)
    {
        afterDropDown = true;
    }

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (afterDropDown)
        {
            afterDropDown = false;
            SelectedIndex = prevIndex;
        }
        else
        {
            prevIndex = SelectedIndex;
        }
    }
}
...