Автозаполнение И предотвращение нового ввода - выпадающий список - PullRequest
5 голосов
/ 30 января 2009

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

Кто-нибудь знает, как это сделать?

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

Если вы использовали Quickbook's Timer, это стиль комбо-ящиков, который я собираюсь использовать.

Ответы [ 4 ]

7 голосов
/ 30 января 2009

Спасибо BFree за помощь, но это решение, которое я искал. ComboBox использует DataSet в качестве источника, поэтому это не пользовательский источник.

    protected virtual void comboBoxAutoComplete_KeyPress(object sender, KeyPressEventArgs e) {
        if (Char.IsControl(e.KeyChar)) {
            //let it go if it's a control char such as escape, tab, backspace, enter...
            return;
        }
        ComboBox box = ((ComboBox)sender);

        //must get the selected portion only. Otherwise, we append the e.KeyChar to the AutoSuggested value (i.e. we'd never get anywhere)
        string nonSelected = box.Text.Substring(0, box.Text.Length - box.SelectionLength);

        string text = nonSelected + e.KeyChar;
        bool matched = false;
        for (int i = 0; i < box.Items.Count; i++) {
            if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().StartsWith(text, true, null)) {
                matched = true;
                break;
            }
        }

        //toggle the matched bool because if we set handled to true, it precent's input, and we don't want to prevent
        //input if it's matched.
        e.Handled = !matched;
    }
2 голосов
/ 30 октября 2012

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

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
  String text = ((TextBox)sender).Text.Substring(
    0, ((TextBox)sender).SelectionStart) + e.KeyChar;
  foreach(String s in this.shippers)
    if (s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()) ||
      e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete)
        return;                    

  e.Handled = true;
}
1 голос
/ 22 мая 2015

Я знаю, что опаздываю на шесть лет, но, может быть, это кому-нибудь поможет.

    private void comboBox1_Leave(object sender, EventArgs e)
    {
        if (comboBox1.Items.Contains(comboBox1.Text)) { MessageBox.Show("YE"); }
        else { MessageBox.Show("NE"); }

        OR

        if (comboBox1.FindStringExact(comboBox1.Text) > -1) { MessageBox.Show("YE"); }
        else { MessageBox.Show("NE"); }
    }
1 голос
/ 30 января 2009

ОК, вот что я придумала. Hack? Может быть, но эй, это работает. Я просто заполнил поле со списком дней недели (эй, мне что-то нужно), а затем обработал событие нажатия клавиши. При каждом нажатии клавиши я проверяю, совпадает ли это слово с началом любого слова в AutoCompleteSourceCollection. Если этого не произойдет, я установлю для e.Handled значение true, чтобы ключ не регистрировался.

    public Form5()
    {
        InitializeComponent();

        foreach (var e in Enum.GetValues(typeof(DayOfWeek)))
        {
            this.comboBox1.AutoCompleteCustomSource.Add(e.ToString());
        }

        this.comboBox1.KeyPress += new KeyPressEventHandler(comboBox1_KeyPress);

    }

    private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        string text = this.comboBox1.Text + e.KeyChar;
        e.Handled =  !(this.comboBox1.AutoCompleteCustomSource.Cast<string>()
           .Any(s => s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()))) && !char.IsControl(e.KeyChar);
    }

РЕДАКТИРОВАТЬ: Если вы используете .Net 3.5, вам нужно ссылаться на System.Linq. Если вы используете .NET 2.0, используйте это вместо:

    private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        string text = this.comboBox1.Text + e.KeyChar;
       foreach (string s in this.comboBox1.AutoCompleteCustomSource)
        {
            if (s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()))
            {
                return;
            }
        }
        e.Handled = true;

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