占位符在多个文本框上

时间:2017-06-26 18:24:46

标签: c# textbox placeholder

我使用以下功能在文本框中创建占位符效果,并且工作正常。

现在,我想在多个文本框中使用它。由于我只有一个框,placeholder变量就足够了。有多个框,我需要多个占位符字符串。有没有办法将自定义属性添加到文本框中,以便我可以从占位符函数访问它?

public MainForm()
{
    InitializeComponent();
    Placeholder_Show(DomainBox, null);
}

public static string placeholder = "example.com";

private void Placeholder_Hide(object sender, EventArgs e)
{
    var box = sender as TextBox;
    if (box.Text == placeholder)
    {
        box.Text = "";
        box.ForeColor = Color.Black;
        box.Font = new Font("Segoe UI", 10.2F, FontStyle.Regular);
    }
}

private void Placeholder_Show(object sender, EventArgs e)
{
    var box = sender as TextBox;
    if (string.IsNullOrEmpty(box.Text))
    {
        box.Text = placeholder;
        box.ForeColor = Color.Gray;
        box.Font = new Font("Segoe UI", 10.2F, FontStyle.Italic);
    }
}

所需代码(示例):

textBox1.placeholder = "some";
textBox2.placeholder = "string";

private void Placeholder_Hide(object sender, EventArgs e)
{
    var box = sender as TextBox;
    if (box.Text == box.placeholder) // placeholders are associated with boxes
    {
        box.Text = "";
        box.ForeColor = Color.Black;
        box.Font = new Font("Segoe UI", 10.2F, FontStyle.Regular);
    }
}

private void Placeholder_Show(object sender, EventArgs e)
{
    var box = sender as TextBox;
    if (string.IsNullOrEmpty(box.Text))
    {
        box.Text = box.placeholder;
        box.ForeColor = Color.Gray;
        box.Font = new Font("Segoe UI", 10.2F, FontStyle.Italic);
    }
}

我不熟悉C#。或许,有更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:0)

如评论中所述,您可以继承Textbox并添加该功能。这可能是一般的最佳选择,但是如果你想使用这样的几个不相关的调整怎么办?另一种选择是以与ErrorProvider类似的方式实现它。您将注意到此组件将属性添加到表单上的其他控件。这是通过extender provider完成的。

答案 1 :(得分:0)

经过一番研究,我发现你可以创建自定义控件。我决定创建一个带占位符效果的自定义文本框,这样下次我需要这样的东西时我就不用费心了。

添加了新的类文件:CustomControls.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CustomControls
{
    public class CustomTextBox : TextBox
    {
        private string _placeholder;

        public string Placeholder
        {
            get { return this._placeholder; }
            set {
                this._placeholder = value;
                this.Placeholder_Show(null, null);
            }
        }

        public CustomTextBox()
        {
            Initialize();
        }

        private void Initialize()
        {
            this.Enter += new EventHandler(this.Placeholder_Hide);
            this.Leave += new EventHandler(this.Placeholder_Show);
        }

        private void Placeholder_Hide(object sender, EventArgs e)
        {
            if (this.Text == this._placeholder)
            {
                this.Text = "";
                this.ForeColor = Color.Black;
                this.Font = new Font("Segoe UI", 10.2F, FontStyle.Regular);
            }
        }

        private void Placeholder_Show(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.Text))
            {
                this.Text = this._placeholder;
                this.ForeColor = Color.Gray;
                this.Font = new Font("Segoe UI", 10.2F, FontStyle.Italic);
            }
        }
    }
}

编辑设计器文件:MainForm.Designer.cs(不想创建新文本框)

更改

this.DomainBox = new System.Windows.Forms.TextBox();

this.DomainBox = new CustomControls.CustomTextBox();

现在,这个新的CustomTextBox出现在工具箱中,名称为" [namespace] Components"在顶部。你可以拖拽以与普通文本框相同的方式删除它。此外,您可以在名称Misc。

下的属性窗口中访问Placeholder属性