我想在C#中實現我自己的ComboBox類,因爲,直到3.5 NET框架(如果我不錯)建議查找是用「StartWith」函數(即如果列表包含「Doe,John」和用戶類型「John」,該項目不顯示)。基本上,我添加或刪除文本更改事件的項目,從列表的初始內容中獲取它們。一切工作都很好,我正在尋找什麼,唯一的問題是,當單擊ComboBox時,即使它不等於插入的文本仍然選擇一個項目。繼我做的例子之後,我希望僅當用戶點擊它時,「Doe,John」被選中(並設置爲ComboBox.Text屬性),如果用戶只是鍵入「John」並且沒有項目嚴格等於它(不只是包含它),那麼在用戶插入它時Text屬性必須保持不變。這是我的派生類的代碼c#防止自定義組合框自動選擇一個項目
public class customTB : ComboBox
{
private object[] startlist;
public customTB() : base()
{
this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.None;
this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.None;
this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown;
this.Sorted = true;
this.KeyPress += customTB_KeyPress;
this.TextChanged += customTB_TextChanged;
this.Enter += customTB_Enter;
}
void customTB_Enter(object sender, EventArgs e)
{
this.DroppedDown = (this.Items.Count > 0);
}
void customTB_TextChanged(object sender, EventArgs e)
{
UpdateList();
}
void customTB_KeyPress(object sender, KeyPressEventArgs e)
{
this.DroppedDown = (this.Items.Count>0);
}
void UpdateList()
{
if (this.startlist == null)
{
//get starting lists elems
this.startlist = new Object[this.Items.Count];
this.Items.CopyTo(this.startlist, 0);
}
this.BeginUpdate();
foreach (object o in startlist)
{
if (o.ToString().Contains(this.Text))
{
if (!this.Items.Contains(o))
this.Items.Add(o);
}
else if (this.Items.Contains(o))
this.Items.Remove(o);
}
this.EndUpdate();
}
}
如果試過,你嘗試退出組合框任何時候,文本被高亮,並將其值設置爲一個項目。 作爲我想要的例子是: 項目包含「Doe約翰」,「史密斯約翰」,「史密斯瑪麗」。 如果用戶鍵入「John」,則下拉項目是「Doe John」和「Smith John」,但是如果他沒有點擊任何下拉元素並退出組合框(即單擊外部),則文本仍然是「John」
我試過了,行爲仍然是一樣的,當我嘗試退出組合框時,所有文本都會高亮顯示,並且項目會替換插入控件 –
@Alessandro Perla中的文本。是的,你是對的,但只要焦點離開組合框就會被移除。但是,如果您希望立即刪除它,則可以使用DropDownClosed事件處理程序而不是驗證的事件處理程序。在這方面,我也修改了上面的答案。 – Rupesh
真的,很好的解決方法,謝謝。我想添加的唯一的注意事項是我想要在關閉下拉列表時輸入文本不是空字符串,所以我設置了一個私有字符串變量,在該變量中複製TextChanged事件中的Text屬性的值,並設置它返回DropDownClosed而不是String.Empty。謝謝! –