【问题标题】:Initializing properties in custom control and making events在自定义控件中初始化属性并制作事件
【发布时间】:2018-12-02 17:00:08
【问题描述】:

我创建了具有一些属性的自定义控件 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;
        }
    }
}


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

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

【问题讨论】:

  • 可以在构造函数中设置你在设计器中设置的属性吗?
  • @jaredbaszler 我不能这样做,因为我需要将此控件用于不同的用途

标签: winforms events properties custom-controls


【解决方案1】:

让我们首先关注您面临的问题。但请务必阅读注意

问题出在这里 → 在构造函数中,您已将 text 设置为 PlaceHolderText 属性的值。那时,PlaceHolderText 是空的。

即使您在构造函数中为Text 属性设置了默认的硬编码值,当您将自定义文本框的实例拖放到表单上时,TextBoxDesignerInitializeNewComponent 方法也会设置Text属性为空字符串。如果您关闭并重新打开设计器,您的文本将出现。

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

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

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

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

【讨论】:

  • 还想了解如何创建活动,请关注this post
  • 如果您对答案有任何疑问,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多