在自定义控件中初始化属性并进行事件

时间:2018-06-23 12:19:54

标签: winforms events properties custom-controls

我创建了具有某些属性的自定义控件PlaceHolderTextBox。 这是我的代码:

class PlaceHolderTextBox:TextBox
{
    public string PlaceHolderText { get; set; }
    public Color PlaceHolderColor { get; set; }
    public Font PlaceHolderFont   { get; set; }
    public Color StandardColor    { get; set; }
    public PlaceHolderTextBox()
    {
        GotFocus    += OnGetFocus;
        LostFocus   += OnLostFocus;
        TextChanged += OnTextChanged;

        Text      = PlaceHolderText;
        ForeColor = PlaceHolderColor;
        Font      = PlaceHolderFont;

    }
    private void OnGetFocus(object sender,EventArgs e)
    {
        if (this.Text == this.PlaceHolderText)
        {
            ForeColor = StandardColor;
            Text = "";
        }
    }
    private void OnLostFocus(object sender, EventArgs e)
    {
        if (this.Text == "")
        {
            ForeColor = PlaceHolderColor;
            Text = PlaceHolderText;
        }
    }
}


在设计器中,我设置值:
image

当我启动程序时,我得到一个空的文本框。
我认为该行为的原因是构造函数按时执行,属性为空,但我不确定。
另外,我想在更改这些自定义属性时进行事件。
有可能吗?

1 个答案:

答案 0 :(得分:0)

让我们首先关注您面临的问题。但是请确保您已阅读 注释

这是问题所在→在构造函数中,您已将文本设置为PlaceHolderText属性的值。当时PlaceHolderText为空。

即使您为构造函数中的Text属性设置了默认的硬编码值,当您在窗体上放置自定义文本框的实例时,InitializeNewComponent的{​​{1}}方法将TextBoxDesigner属性设置为空字符串。如果关闭并重新打开设计器,将显示您的文本。

注意-为什么不应该通过设置Text属性来显示占位符文本

通过在TextText事件中设置和重置GotFocus/LostFocus属性来实现占位符功能绝对不是一个好主意,因为:

  • 使用数据绑定时会出现问题,当绑定到数字或日期属性或应采用特定格式的属性时,它将引发验证错误。
  • 数据绑定时,如果按“保存”按钮,占位符值将被不必要地保存在数据库中。
  • 根据您的代码,如果用户键入的值与您为占位符设置的值相同,那么当失去焦点时,会将其重置为空。是错的。

要使用占位符(也称为提示,水印和提示横幅),可以使用以下解决方案之一:native text box featurecustom paint solution