Большинство ответов верны, но я хочу добавить немного больше. Тернарный оператор является правоассоциативным, что означает, что он может быть связан следующим образом 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; }
}
Подробнее здесь здесь
После некоторой помощи из других ответов я пришел к этому быстрому решению:
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);
}
}
У вас есть две проблемы. Первый довольно простой: определите, следует ли раскрывать раскрывающийся список или закрыть. Этот код может сделать это:
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.
}
}
}
Вы можете получить координаты X, Y щелчка мыши, и оттуда вы можете принудительно свернуть его, если его нет в раскрывающемся "значке" (из-за отсутствия лучшее слово).