2015-10-27 22 views
0

我正在修复使用名为CompleteComboBox的用户控件的c#项目。C#Combobox用户控件不起作用,因为它应该

它功能部分。

  1. 退格不起作用。

  2. 第一次用户在textbox部件中输入字符串时,该列表将按照其应有的方式打开,并且位于右侧。第二次 - 列表未打开,但显示textbox部分中的匹配行。然后,如果我打开列表并开始编写其中一个项目的开头,但是然后单击其中一个项目,然后按回车 - 此项目未被选中,而是在text box部件中输入字母时选择的项目。

希望我明白了。

下面是代码:

namespace BestInvest.UserControls 
{ 
public partial class CompleteComboBox : System.Windows.Forms.ComboBox 
{ 
    public event System.ComponentModel.CancelEventHandler NotInList; 

    private bool _limitToList = true; 
    private bool _inEditMode = false; 

    bool start; 

    public CompleteComboBox() 
     : base() 
    { 

     start = true; 
     this.Text = ClsConsts.InitializeTextForCombo; 

    } 

    [Category("Behavior")] 
    public bool LimitToList 
    { 
     get { return _limitToList; } 
     set { _limitToList = value; } 
    } 

    protected virtual void OnNotInList(System.ComponentModel.CancelEventArgs e) 
    { 
     if (NotInList != null) 
     { 
      NotInList(this, e); 
     } 
    } 

    protected override void OnTextChanged(System.EventArgs e) 
    { 
     if (_inEditMode) 
     { 
      string input = Text; 
      int index = FindString(input); 

      if (index >= 0) 
      { 
       _inEditMode = false; 
       SelectedIndex = index; 
       _inEditMode = true; 
       Select(input.Length, Text.Length); 
       //base.DroppedDown = true; 
      } 
     } 

     base.OnTextChanged(e); 
    } 

    protected override void OnValidating(System.ComponentModel.CancelEventArgs e) 
    { 
     if (this.LimitToList) 
     { 
      int pos = this.FindStringExact(this.Text); 

      if (pos == -1) 
      { 
       OnNotInList(e); 
      } 
      else 
      { 
       this.SelectedIndex = pos; 
      } 
     } 

     base.OnValidating(e); 
    } 

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e) 
    { 
     if (start) 
     { 
      base.DroppedDown = true; 
      //else 
      start = false; 
     } 

     if (e.KeyCode == Keys.Enter) 
     { 
      base.DroppedDown = false; 
      start = true; 
     } 

     _inEditMode = true; 

     base.OnKeyDown(e); 
    } 
} 

}

+0

对不起,我不是很明白,你的意思是“不能正常工作”......什么是预期的行为和什么是故障?请澄清! – Shnugo

回答

1

你的代码是凌乱。看看start标志。在所有你期望的情况下,它都不是真的。这就是为什么第一次行为与第二次行为不同。

您的OnKeyDown事件不会触发您期望的所有键。这就是退格不起作用的原因。有几篇关于检测退格的帖子:See for example this one

+0

谢谢Vilhelm。 –

+0

但是,我需要一些更多的帮助。这不是我的代码,所以这就是为什么修复它有点困难。退格行为并不真的让我担心。我应该在哪里设置开始标志为真,这样第二次组合框的确能按预期工作? –

+0

请....一个线索....我应该在哪里添加一个开始标志设置为真? –

相关问题