因为要编写一个自定义ComboBox,所以通过继承原有控件类来实现,再添加自定义的功能。问题就出在这个实现的过程中,还没有编写几行代码,马上发现了一个怪异的现象:
(逻辑上)明明没有向ComboBox的Items属性中添加任何内容,偏偏在测试的时候, 在设计界面的Items属性中,发现了控件的Name属性值给添加了进去。
1.将自定义控件添加到“工具箱”;
2.拖动“工具箱”里的自定义控件“YEComboBox”到窗体中
(注:在这一步,仔细观察会发现,系统在绘制控件的刹那间,text文本框里面显现了一下默认的控件名“yeComboBox1”,然后迅速消失,在下次测试性添加相同控件的时候,就观察不到这个现象了,可能系统已经有“缓存”啦?)
3.查看控件“属性”里的“Items”项,在“字符串集合编辑器”中,就出现了刚才第2步中异常出现的默认控件名。
以下是该自定义控件的全部代码,非常少,但是就是不知道该怎么解决该问题。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Text;using System.Windows.Forms;using System.IO;namespace YEControl{ /// <summary> /// 能够读取和保存历史记录的下拉框控件。 /// </summary> [ToolboxBitmap(typeof(ComboBox))] partial class YEComboBox : ComboBox { public YEComboBox() { InitializeComponent(); } /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region 组件设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { components = new System.ComponentModel.Container(); this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; this.AllowDrop = true; this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; this.Name = "YEComboBox"; } #endregion protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); //只有当下拉列表框中不存在的时候才添加到集合中显示。 if (this.Text != "" && !this.Items.Contains(this.Text)) this.Items.Add(this.Text); } }}
至此,问题就出现在最后一段重写OnTextChanged事件上。因为是通过设计器添加控件,所以无法调试。我也曾经试过直接通过代码添加该控件到窗体上,没有发现这个异常!
所以现在正在寻找解决方案中……