我正在尝试创建一个自定义TextBox,当Drag&放入表单显示“customTextBox1”,“customTextBox2”就像在标签和按钮中一样。
我试着这样做:
public CustomTextBox()
{
InitializeComponent();
ReadOnly = true;
TabStop = false;
BorderStyle = BorderStyle.None;
Text = "customTextBox";
}
其他属性工作正常,但是在拖动customTextBox后显示我需要构建或启动程序的文本,或者文本将保持为空并且拖动更多CustomTextBox后customTextBox的编号不会上升。
注意:我不想要任何PlaceHolder或类似的东西。
答案 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
字段,但是一旦控件由设计者创建,Text
和Name
字段可单独编辑,就像在默认TextBox
或Label
控件中一样。
要使其发挥作用,您必须添加对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;
}
}
}