zoukankan      html  css  js  c++  java
  • 编程疑难杂症の设计器帮Items添加的莫名项

    引言:

    在编程的过程中,总会碰到一些让人无从下手去解决的问题。在此特地记录下来,一来借助园友的力量帮忙解决问题,二来也给碰到同样问题的朋友提供一点点帮助。

    问题说明:

    因为要编写一个自定义ComboBox,所以通过继承原有控件类来实现,再添加自定义的功能。问题就出在这个实现的过程中,还没有编写几行代码,马上发现了一个怪异的现象:
    (逻辑上)明明没有向ComboBox的Items属性中添加任何内容,偏偏在测试的时候, 在设计界面的Items属性中,发现了控件的Name属性值给添加了进去。

    image

    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事件上。因为是通过设计器添加控件,所以无法调试。我也曾经试过直接通过代码添加该控件到窗体上,没有发现这个异常!

    所以现在正在寻找解决方案中……

    作者:Asion Tang
    凡是没有注明[转载]的文章,本Blog发表的文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Excel中的Vlookup函数用法
    C# WinForm 在窗口菜单上显示已打开窗体的标题及其窗体的排列
    C#使用Windows注册表编辑
    World Creater
    AtService.exe 占用CPU资源较高的解决办法
    几段SQL Server语句和存储过程(转载)
    代码转换工具
    ReSharper 4.5 Feature Map
    DXperienceXaf9.2.6 Personal Computer SN
    RegexBuddy v3.1.1 破解版
  • 原文地址:https://www.cnblogs.com/AsionTang/p/2015190.html
Copyright © 2011-2022 走看看