Скрыть DropDownList в ComboBox - PullRequest
       13

Скрыть DropDownList в ComboBox

3 голосов
/ 10 августа 2011

Как скрыть DropDownList в ComboBox?

Я хочу использовать ComboBox только для отображения текста.
Этот элемент управления выглядит хорошо, для меня он лучше, чем TextBox plus Button.
Поэтому элемент управления должен быть включен, но без каких-либо элементов.
Когда пользователь нажимает стрелку (или клавишу Alt + Down), DropDownList не должен отображаться, потому что я не выберу значение из пользовательского DataGridView для заполнения текста в ComboBox.

Редактировать. Альтернативное решение имеет значение DropDownHeight, равное 1, с отображением только 1 пиксельной линии после нажатия элемента управления.

Edit. Реальное решение. Ответ ниже

Ответы [ 5 ]

5 голосов
/ 10 августа 2011

Вы можете перехватить сообщения, которые вызывают раскрывающийся список, в подклассе.Следующий фрагмент определяет элемент управления NoDropDownBox, который игнорирует щелчки мыши, которые приводят к раскрытию раскрывающегося списка:

public class NoDropDownBox : ComboBox
{
    public override bool PreProcessMessage(ref Message msg)
    {
        int WM_SYSKEYDOWN = 0x104;

        bool handled = false;

        if (msg.Msg == WM_SYSKEYDOWN)
        {
            Keys keyCode = (Keys)msg.WParam & Keys.KeyCode;

            switch (keyCode)
            {
                case Keys.Down:
                    handled = true;
                    break;
            }
        }

        if(false==handled)
            handled = base.PreProcessMessage(ref msg);

        return handled;
    }

    protected override void WndProc(ref Message m)
    {            
        switch(m.Msg)
        {
            case 0x201:
            case 0x203:
                break;

            default:
                base.WndProc(ref m);
                break;
        }
    }
}
3 голосов
/ 10 августа 2011

У вас будет меньше проблем и вы получите лучший конечный результат, просто создав пользовательский контроль с текстовым полем и кнопкой, стилизованной под ваши желания.Если вы придумали способ удалить функциональность комбинированного списка, все, что вы действительно делаете, это создаете ненужную сложность.

1 голос
/ 10 августа 2011

[Обновлено]

ОК, вы не можете установить поле со списком только для чтения, но вы можете установить Enabled = false.

Я никогдапопробовал это, но, возможно, вы могли бы установить MaxDropDownItems в 0.

Но, вы все равно установите текст поля со списком в значение, которое вы хотите в коде.Редактировать]

Другая идея: установите DropDownHeight в 0 (... или 1, если не примет 0).

1 голос
/ 10 августа 2011

Может быть, лучше создать пользовательский элемент управления один раз и использовать его в любое время, когда вам понадобится эта функция.Если вы работаете с Windows Forms, возможно, самый простой способ - это унаследовать класс UserControl и создать свой компонент с помощью визуального дизайнера, написав немного кода.Вы также можете опускать класс ComboBox и кодировать собственную логику рисования, но, похоже, она требует дополнительной работы.

0 голосов
/ 10 августа 2011

Если для DropDownStyle установлено значение DropDown , а для Text установлено значение " Something ", тогда ваш ComboBox не выпадает, когда пользователь нажимает кнопку.

По крайней мере, я получаю такое поведение в WinForms (C # 4.0).Это то, что вы пытаетесь достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...