C#设置自定义TextBox

时间:2017-06-12 20:58:23

标签: c# textbox

我正在尝试创建一个自定义TextBox,当Drag&放入表单显示“customTextBox1”,“customTextBox2”就像在标签和按钮中一样。

我试着这样做:

    public CustomTextBox()
    {
        InitializeComponent();

        ReadOnly = true;
        TabStop = false;
        BorderStyle = BorderStyle.None;
        Text = "customTextBox";
    }

其他属性工作正常,但是在拖动customTextBox后显示我需要构建或启动程序的文本,或者文本将保持为空并且拖动更多CustomTextBox后customTextBox的编号不会上升。

注意:我不想要任何PlaceHolder或类似的东西。

1 个答案:

答案 0 :(得分:0)

您的问题是此帖子How would I set the label of my UserControl at design time?的部分副本,但答案并不完全适用,因为您继承自TextBox而非UserControl并且初始化例程是有点不同。这样做根本不直观,这是不幸的,因为所有默认文本控件在设计人员最初创建它们时将Text属性设置为Name属性,这是不幸的。 / p>

诀窍是为您的组件实施ControlDesigner(来自System.Windows.Forms.Design)。只要在表单上创建了新控件,Win ControlDesigner.InitializeNewComponent就会被WinForms设计器调用一次。您可以将Text属性设置为Name属性,而不会对非设计代码产生副作用,也不会干扰设计人员对组件的序列化。

我在设计器中验证了这一点 - 它正确地设置Text字段以匹配设计者生成的Name字段,但是一旦控件由设计者创建,TextName字段可单独编辑,就像在默认TextBoxLabel控件中一样。

要使其发挥作用,您必须添加对System.Design 的项目引用,该引用包含System.Windows.Forms.Design命名空间。

using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace StackOverflowAnswers.CustomControlDefaultText
{
    class CustomTextBoxDesigner : ControlDesigner
    {
        public CustomTextBoxDesigner()
        {

        }

        public override void InitializeNewComponent(IDictionary defaultValues)
        {
            // Allow the base implementation to set default values,
            // which are provided by the designer.
            base.InitializeNewComponent(defaultValues);

            // Now that all the basic properties are set, we
            // do our one little step here. Component is a
            // property exposed by ControlDesigner and refers to
            // the current IComponent being designed.
            CustomTextBox myTextBox = Component as CustomTextBox;
            if(myTextBox != null)
            {
                myTextBox.Text = myTextBox.Name;
            }
        }
    }

    // This attribute sets the designer for your derived version of TextBox
    [Designer(typeof(CustomTextBoxDesigner))]
    class CustomTextBox : TextBox
    {
        public CustomTextBox() : base()
        {
            ReadOnly = true;
            TabStop = false;
            BorderStyle = BorderStyle.None;
        }
    }
}