Поле «Только для чтения» Windows Forms - PullRequest
2 голосов
/ 03 октября 2010

Есть ли способ сделать комбо-бокс форм Windows доступным только для чтения?Чтобы быть конкретным: пользователь должен иметь возможность вводить, но должны быть разрешены только те значения в поле (с помощью автозаполнения или выбора из списка).

Или это единственный способ использовать проверкусобытие?

С уважением

Марио

Ответы [ 3 ]

3 голосов
/ 03 октября 2010

Если вы установите AutoCompleteMode = SuggestAppend и AutoCompleteSource = ListItems, когда пользователь что-то печатает, автоматически в поле со списком выводятся записи, которые начинаются с набранных символов.

Затем, обрабатывая события SelectedIndexChanged или SelectedValueChanged, вы сможете перехватывать, когда пользователь точно вводит значение, присутствующее в списке значений.

Если вы также абсолютно не хотите, чтобы пользователь печатал что-либо, чего нет в списке, ну да, вы должны обработать, например, KeyDown событие, например:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    char ch = (char)e.KeyValue;
    if (!char.IsControl(ch))
    {
        string newTxt = this.comboBox1.Text + ch;
        bool found = false;
        foreach (var item in this.comboBox1.Items)
        {
            string itemString = item.ToString();
            if (itemString.StartsWith(newTxt, StringComparison.CurrentCultureIgnoreCase))
            {
                found = true;
                break;
            }
        }
        if (!found)
            e.SuppressKeyPress = true;
    }
}
3 голосов
/ 03 октября 2010

Вы можете установить DropDownStyle равным DropDownList, но это на самом деле не позволяет печатать (но позволяет выбирать с клавиатуры)

Если вы хотите, чтобы пользователь мог вводить / видеть неполные слова, вам придется использовать событие.Валидация будет лучшим выбором.

0 голосов
/ 08 мая 2014

Спасибо.вышеупомянутый метод работает для меня кроме кода события KeyDown.Потому что комбинированный список присоединен к DataTable.Попробуйте приведенный ниже код, если выпадающий список присоединен к DataTable, и если вы также абсолютно не хотите, чтобы пользователь печатал что-либо, чего нет в списке.

private void cmbCountry_KeyDown(object sender, KeyEventArgs e)
    {
        char ch = (char)e.KeyValue;
        if (!char.IsControl(ch))
        {
            string newTxt = this.cmbCountry.Text + ch;
            bool found = false;
            foreach (var item in cmbCountry.Items)
            {
                DataRowView row = item as DataRowView;
                if (row != null)
                {
                    string itemString = row.Row.ItemArray[0].ToString();
                    if (itemString.StartsWith(newTxt,     StringComparison.CurrentCultureIgnoreCase))
                    {
                        found = true;
                        break;
                    }
                }
                else
                    e.SuppressKeyPress = true;
            }
            if (!found)
                e.SuppressKeyPress = true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...