Предотвращение выпадения комбо - PullRequest
3 голосов
/ 23 июня 2009

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

EDIT

Спасибо всем, кто так быстро ответил!

Я уже рассматривал вариант размещения текстового поля или метки в том же месте, что и поле со списком, а затем скрывать поле со списком по требованию, но отклонил идею из-за сложности (существует довольно много комбинаций на форма). Я также посмотрел на простой режим, но это убирает выпадающую часть комбо. Я полагаю, что я действительно хочу сделать, это отключить комбо, но без того, чтобы оно выглядело так, как будто оно отключено, и все еще позволяет пользователю выбирать отображаемые данные (например, для операций копирования и вставки).

Ответы [ 8 ]

5 голосов
/ 07 августа 2009

Во-первых, вам нужно создать новый класс, унаследованный от ComboBox (полный код ниже). Вам не нужно переопределять многие методы. Добавьте логическое свойство, чтобы определить, когда вы хотите, чтобы оно выпадало. Суть функциональности заключается в переопределении метода OnDrawItem. По сути, если ваше состояние (каким бы оно ни было) верно, вы не рисуете ни одного из элементов в выпадающем списке. Вам необходимо переопределить метод OnDropDown и установить DropDownHeight = 1 (0 недопустимо), в противном случае поле со списком будет по-прежнему выпадать в своем обычном размере, но будет казаться пустым. Поле со списком все еще опускается, но вы не можете видеть его, потому что его высота составляет всего 1 пиксель. Важно установить DrawMode в OwnerDrawFixed в методе New, чтобы выполнялся код OnDrawItem.

Когда вы сбрасываете DropDownHeight, чтобы элементы отображались, вы можете либо использовать сохраненное значение из исходной высоты, либо установить для него произвольно большое значение, которое, как вы знаете, будет больше, чем вам нужно; поле со списком автоматически уменьшит эту высоту, так что она будет не больше, чем необходимо для отображения всех элементов.

Вы могли бы упростить вещи, установив DrawMode в Normal и ТОЛЬКО переопределив метод OnDropDown, но OnDrawMethod дает вам почти полный контроль над тем, как отображается ваш список элементов (если это то, что вам нужно).

Public Class simpleCombo
    Inherits ComboBox

    Private _myCondition As Boolean = False

    Public Property myCondition() As Boolean
        Get
            Return _myCondition
        End Get
        Set(ByVal value As Boolean)
            _myCondition = value
        End Set
    End Property

    Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)
        If _myCondition Then
            Me.DropDownHeight = 1
        Else
            Me.DropDownHeight = 200 //some arbitrarily large value
        End If

        MyBase.OnDropDown(e)
    End Sub

    Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)

        If _myCondition Then
            Return
        Else
            MyBase.OnDrawItem(e)
            e.DrawBackground()
            e.Graphics.DrawString(Me.Items(e.Index), Me.Font, New SolidBrush(Me.ForeColor), e.Bounds)
            e.DrawFocusRectangle()
        End If

    End Sub

    Public Sub New()
        Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
    End Sub

End Class
4 голосов
/ 23 июня 2009

Вы можете управлять этим с помощью свойства DropDownStyle (не в событии DropDown, хотя ... это слишком поздно). Это заставит поле со списком появляться в виде текстового поля.

if (DropDownShouldBeVisible())
{
    comboBox.DropDownStyle = ComboBoxStyle.DropDownSimple;
}
else
{
    comboBox.DropDownStyle = ComboBoxStyle.Simple;
}

Обратите внимание, однако, что пользователь по-прежнему может выбирать значения в списке с помощью клавиш со стрелками в этом случае. Если вы хотите предотвратить это, замените его другим подходящим элементом управления в том же месте, как это предложено Конрадом.

2 голосов
/ 04 октября 2014

Решением, которое мне помогло, является обработка события Control.Enter путем отключения и повторного включения ComboBox.

private void myComboBox_Enter(object sender, EventArgs e)
{
    // Do some stuff
    myComboBox.Enabled = false;
    myComboBox.Enabled = true;
}

Это будет работать, когда пользователь нажимает или вкладывает в ComboBox.

1 голос
/ 23 июня 2009

Установить его на простой, а затем отменить любые нажатия клавиш?

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e)
{

  if (dropDownList.DropDownStyle == ComboBoxStyle.Simple)
  {
    e.Handled = true;
  }

}
1 голос
/ 23 июня 2009

Не можете ли вы просто установить DropDownStyle на простой? Если я правильно помню, это делает то, что вы хотите, хотя прошло некоторое время, так как я коснулся WinForms.

Edit:

dropDownList.DropDownStyle = ComboBoxStyle.Simple;
0 голосов
/ 23 июня 2009

Установите Enabled в false - это не дает пользователю выбрать значение. Поскольку я не вижу другого способа предотвратить выпадение списка, единственный альтернативный способ, который я могу придумать, - это временно удалить все элементы и добавить их позже.

0 голосов
/ 23 июня 2009

Я согласен с комментарием Конрада Рудольфа. Вы можете поместить текстовое поле в ту же позицию и установить свойства видимости комбинированного списка и текстового поля в true или false.

0 голосов
/ 23 июня 2009

В тех случаях, когда вы не хотите, чтобы пользователь мог видеть / выбирать другие значения, вы должны скрыть DropDown и вместо этого показать статический текстовый контейнер, например, Этикетка.

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