2013-05-09 2 views
2

У меня есть поле со списком со списком предметов. Когда пользователь начнет печатать, откроется раскрывающийся список. Нажатие клавиши должно проверить текст поля со списком.Нажатие Enter в Combobox очищает текст

Для этого я установил DroppedDown = true внутри моего события keydown. Однако после того, как я сделал это, нажатие клавиши заставляет текст поля со списком быть пустым.

private void cmbItems_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!e.KeyCode.Equals(Keys.Enter)) { 
     if (!cmbItems.DroppedDown) { 
      cmbItems.DroppedDown = true; 
     } 
    } 
    else { 
     //Check the text 
    } 
} 

Почему текст поля со списком удаляется, и есть ли способ вокруг него?

Мои пользователи предпочли бы, чтобы я не использовал AutoCompleteMode.SuggestAppend, но я буду, если придется.

Полный Пример кода:

public class Demo : Form { 
    private System.ComponentModel.IContainer components = null; 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private void InitializeComponent() 
    { 
     this.lblText = new System.Windows.Forms.Label(); 
     this.cmbItems = new System.Windows.Forms.ComboBox(); 
     this.SuspendLayout(); 
     // 
     // lblText 
     // 
     this.lblText.AutoSize = true; 
     this.lblText.Location = new System.Drawing.Point(152, 47); 
     this.lblText.Name = "lblText"; 
     this.lblText.Size = new System.Drawing.Size(155, 13); 
     this.lblText.TabIndex = 17; 
     this.lblText.Text = "Text"; 
     // 
     // cmbItems 
     // 
     this.cmbItems.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append; 
     this.cmbItems.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; 
     this.cmbItems.Location = new System.Drawing.Point(12, 44); 
     this.cmbItems.Name = "cmbItems"; 
     this.cmbItems.Size = new System.Drawing.Size(121, 21); 
     this.cmbItems.TabIndex = 0; 
     this.cmbItems.KeyDown += new System.Windows.Forms.KeyEventHandler(this.cmbItems_KeyDown); 
     // 
     // Demo 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(338, 78); 
     this.Controls.Add(this.lblText); 
     this.Controls.Add(this.cmbItems); 
     this.Name = "Demo"; 
     this.Text = "Demo"; 
     this.ResumeLayout(false); 
     this.PerformLayout(); 

    } 

    #endregion 

    private System.Windows.Forms.Label lblText; 
    private ComboBox cmbItems; 

    DataTable _Items = new DataTable(); 

    public Demo() 
    { 
     InitializeComponent(); 

     BuildListOfItems(); 
    } 

    private void cmbItems_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (!e.KeyCode.Equals(Keys.Enter)) { 
      if (!cmbItems.DroppedDown) { 
       cmbItems.DroppedDown = true; 
      } 
     } 
     else { 
      //Check the text 

     } 

     lblText.Text = cmbItems.Text; 
    } 

    //Create a demo list of items. 
    private void BuildListOfItems() 
    { 
     _Items.Columns.Add("Name").DataType = typeof(string); 
     _Items.Columns.Add("ID").DataType = typeof(int); 

     for (int i = (int)'a'; i < (int)'a' + 26; i++) { 
      CreateItem(i, "", 0); 
     } 
     cmbItems.DataSource = _Items; 
     cmbItems.ValueMember = "ID"; 
     cmbItems.DisplayMember = "Name"; 
    } 

    private void CreateItem(int symbol, string prev, int count) 
    { 
     string newPrev = string.Format("{0}{1}", prev, (char)symbol); 
     _Items.Rows.Add(newPrev, _Items.Rows.Count); 
     if (count < 4) 
      CreateItem(symbol + 1, newPrev, ++count); 

    } 
} 

ответ

0

Я сделал некоторые из этого рано в колледже, и я вернулся и проверил мой код. Я не уверен на 100%, но это то, что вы искали?

private void comboCode_TextType(object sender, EventArgs e) 
    { 
     int itemsIndex = 0; 
     foreach (string item in cmbGageCode.Items) 
     { 
      if (item.IndexOf(cmbGageCode.Text) == 0) 
      { 
       cmbGageCode.SelectedIndex = itemsIndex; 
       cmbGageCode.Select(cmbGageCode.Text.Length - 1, 0); 
       break; 
      } 
      itemsIndex++; 
     } 
    } 
0

Это сработало для меня.

string perfilText = ""; 
... 
private void cbPerfis_KeyUp(object sender, KeyEventArgs e) 
{ 
      if (e.KeyData != Keys.Enter) 
      {     
       perfilText = cbPerfis.Text; 
      } 
      else 
      { 
       cbPerfis.Text = perfilText; 
       cbOrdens.Focus(); 
      } 
} 
Смежные вопросы