如何在用户控件中暴露TextBox的Text属性并避免默认显示控件名
这个问题的根源是WinForm设计器在将自定义控件拖入窗体时,会主动将控件实例的Name属性值赋值给Text属性。你之前添加的DefaultValue特性不生效,一方面是因为设计器的这个赋值动作优先级高于默认值特性,另一方面是你设置的默认值为null,和TextBox的Text属性默认空字符串不匹配。
方案1:修改Text属性逻辑(推荐,兼容性最好)
在Text属性的set访问器中拦截设计器的自动赋值,配合序列化控制逻辑即可:
[Browsable(true)] [DefaultValue("")] public override string Text { get { return textBox1.Text; } set { // 设计时状态下,拦截设计器自动赋值控件名的操作 if (DesignMode && value == this.Name) { return; } textBox1.Text = value; } } // 告诉设计器仅在Text不为空时序列化该属性,避免生成冗余代码 private bool ShouldSerializeText() { return !string.IsNullOrEmpty(Text); }
方案2:轻量修改方案
如果不想调整原有属性逻辑,可以重写控件的OnHandleCreated方法,在控件创建完成后主动清空设计时的默认Text值:
protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); // 仅设计时执行清空操作 if (DesignMode) { this.Text = string.Empty; } }
内容的提问来源于stack exchange,提问作者StephenH
相关产品推荐
相关产品推荐

