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发表的文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/AsionTang/p/2015190.html
Copyright © 2011-2022 走看看