Как я могу вынудить стиль DropDownList ComboBox только открыться, когда пользователь нажимает выпадающую кнопку?

Большинство ответов верны, но я хочу добавить немного больше. Тернарный оператор является правоассоциативным, что означает, что он может быть связан следующим образом if … else if … else if … else:

function example() {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

Эквивалентно:

function example() {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

Подробнее здесь здесь

5
задан Ksempac 25 June 2009 в 13:25
поделиться

3 ответа

После некоторой помощи из других ответов я пришел к этому быстрому решению:

public class MyComboBox : ComboBox
{
    public MyComboBox()
    {
        FlatStyle = FlatStyle.Popup;
        DropDownStyle = ComboBoxStyle.DropDownList;
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0201 /* WM_LBUTTONDOWN */ || m.Msg == 0x0203 /* WM_LBUTTONDBLCLK */)
        {
            int x = m.LParam.ToInt32() & 0xFFFF;
            if (x >= Width - SystemInformation.VerticalScrollBarWidth)
                base.WndProc(ref m);
            else
            {
                Focus();
                Invalidate();
            }
        }
        else
            base.WndProc(ref m);
    }
}
4
ответ дан 14 December 2019 в 19:23
поделиться

У вас есть две проблемы. Первый довольно простой: определите, следует ли раскрывать раскрывающийся список или закрыть. Этот код может сделать это:

    void comboBox1_MouseClick(object sender, MouseEventArgs e)
    {
        ComboBox combo = sender as ComboBox;
        int left = combo.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
        if (e.X >= left)
        {
            // They did click the button, so let it happen.
        }
        else
        {
            // They didn't click the button, so prevent the dropdown.
        }
    }

Вторая проблема более важна - фактически предотвращение появления раскрывающегося списка. Самый простой подход:

comboBox1.DropDownStyle = ComboBoxStyle.DropDown;

Но он позволяет вводить текст в поле, что может вам не понадобиться.

Я потратил около 15 минут на просмотр параметров, и оказалось, что для предотвращения появления раскрывающегося списка и одновременного предотвращения пользователя от ввода в раскрывающийся список вам нужно будет создать подкласс элемента управления. Таким образом, вы можете переопределить OnMouseClick () и вызывать base.OnMouseClick () только тогда, когда они нажимали кнопку. Это выглядело бы примерно так (непроверено):

public class CustomComboBox : ComboBox
{
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);

        int left = this.Width - (SystemInformation.HorizontalScrollBarThumbWidth + SystemInformation.HorizontalResizeBorderThickness);
        if (e.X >= left)
        {
            // They did click the button, so let it happen.
            base.OnMouseClick(e);
        }
        else
        {
            // They didn't click the button, so prevent the dropdown.
            // Just do nothing.
        }
    }
}
1
ответ дан 14 December 2019 в 19:23
поделиться

Вы можете получить координаты X, Y щелчка мыши, и оттуда вы можете принудительно свернуть его, если его нет в раскрывающемся "значке" (из-за отсутствия лучшее слово).

0
ответ дан 14 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: