2017-02-02 5 views
2

У меня есть ComboBox. Его режим автозаполнения установлен на «SuggestAppend», а для источника автозапуска установлено значение «ListItems». Если я попытаюсь обновить список элементов этого поля со списком в обработчике событий Enter, я получаю следующее непредвиденное поведение.Обновление ComboBox Элементы в Enter Обработчик событий с автозаполнением

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

Я подозреваю, что это связано с тем, что, когда я обновляю список элементов внутри обработчика событий Enter, запускается другое событие (список элементов изменен?) Для автозаполнения, чтобы обработать его магию, что приводит к сбрасыванию поля со списком.

Что я могу сделать по этому поводу? Обратите внимание, что для меня несколько важно обновить список элементов в combobox только тогда, когда я знаю, что скоро будет использовано combobox (следовательно, обработчик события ввода).

Вот минимальный компилируемый пример (кнопка есть, так что выпадающий не изначально ориентирован):

Form1 Дизайнер:

partial class Form1 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     this.comboBox1 = new System.Windows.Forms.ComboBox(); 
     this.button1 = new System.Windows.Forms.Button(); 
     this.SuspendLayout(); 
     // 
     // comboBox1 
     // 
     this.comboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; 
     this.comboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; 
     this.comboBox1.FormattingEnabled = true; 
     this.comboBox1.Location = new System.Drawing.Point(50, 83); 
     this.comboBox1.Name = "comboBox1"; 
     this.comboBox1.Size = new System.Drawing.Size(190, 24); 
     this.comboBox1.TabIndex = 1; 
     this.comboBox1.Enter += new System.EventHandler(this.comboBox1_Enter); 
     // 
     // button1 
     // 
     this.button1.Location = new System.Drawing.Point(165, 35); 
     this.button1.Name = "button1"; 
     this.button1.Size = new System.Drawing.Size(75, 23); 
     this.button1.TabIndex = 0; 
     this.button1.Text = "button1"; 
     this.button1.UseVisualStyleBackColor = true; 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(282, 255); 
     this.Controls.Add(this.button1); 
     this.Controls.Add(this.comboBox1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.ResumeLayout(false); 
    } 

    #endregion 

    private System.Windows.Forms.ComboBox comboBox1; 
    private System.Windows.Forms.Button button1; 
} 

Form1.cs:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void comboBox1_Enter(object sender, EventArgs e) 
    { 
     string[] items = new string[] { "A", "B", "C" };   
     comboBox1.Items.Clear(); 
     comboBox1.Items.AddRange(items); 
    } 
} 
+0

вы можете попробовать на что-то событие, как 'если (sender.GetType()! = TypeOf (System.Windows.Controls.ComboBox)) { // делать вещи, только если отправитель является тот, который вы хотите } ' – Madenis

+0

@ Маденис: Я не уверен, что понимаю. Можете ли вы уточнить? –

+0

Или теперь, когда я думаю об этом, возможно, событие срабатывает, очищает список и повторно заполняет его при каждом входе. Таким образом, лучше переместить логику списка в другом месте в другое событие, например comboBox1_loaded – Madenis

ответ

3

Для вашего сценария просто вопрос об использовании модификации ComboBox.Items с помощью BeginUpdate/EndUpdate звонков:

private void comboBox1_Enter(object sender, EventArgs e) 
{ 
    string[] items = new string[] { "A", "B", "C" }; 
    comboBox1.BeginUpdate(); 
    comboBox1.Items.Clear(); 
    comboBox1.Items.AddRange(items); 
    comboBox1.EndUpdate(); 
} 

Это предотвращает немедленное реагирование на вызов, вызвавший возникновение проблемы.

+0

Спасибо, вам кажется, что вы находитесь на –

+0

Если это то, что вы ищете, отметьте как правильный ответ. – Kelly