【问题标题】:How do I fill an empty textbox with default text?如何用默认文本填充空文本框?
【发布时间】:2011-07-07 21:17:48
【问题描述】:

如果文本框为空,如何用文本填充?我正在使用 VB.NET。

【问题讨论】:

    标签: .net vb.net winforms textbox


    【解决方案1】:

    您可能想要处理TextChanged 事件并在触发事件时如果文本框为空设置一些默认文本。

    我没有VB.NET的例子,但是下面的C#应该太难理解了:

    public Form1()
    {
        this.InitializeComponent();
    
        textBox1.Tag = "Default text";
        textBox1.Text = (string)textBox1.Tag;
        textBox1.TextChanged += new EventHandler(OnTextChanged);
    }
    
    void OnTextChanged(object sender, EventArgs e)
    {
        var textbox = (TextBox)sender;
    
        if (string.IsNullOrEmpty(textbox.Text))
        {
            textbox.Text = (string)textbox.Tag;
        }
    }
    

    并且事件处理程序可以重复用于多个文本框。

    编辑:这在 VB.NET 中几乎相同

    Sub New()
        ' This call is required by the designer.
        InitializeComponent()
    
        TextBox1.Tag = "Default text"  ' This can be set with the designer
        TextBox1.Text = CStr(TextBox1.Tag)
    End Sub
    
    Private Sub OnTextBoxTextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim textbox As TextBox = DirectCast(sender, TextBox)
    
        If String.IsNullOrEmpty(textbox.Text) Then
            textbox.Text = CStr(textbox.Tag)
            textbox.SelectAll()
        End If
    End Sub
    

    当然,您也可以使用本机 Windows 功能实现类似的行为,但即使您不想使用 Win32,几行托管代码也能满足您的所有需求。

    【讨论】:

    • 您的 VB.NET 示例忘记将 Tag 属性转换为 StringDirectCast() 基本上等同于您的 C# 示例。
    • 其实,我应该做的是删除DirectCast 以使代码不那么冗长。 VB.NET 编译器在进行强制转换时非常智能,并且会自动将 Tag 属性的转换添加到 String 以及 DirectCast(如果省略)。
    • “动态输入”与“智能”不同。如果您打开了 Option Strict,编译器将不会这样做。将Object 拆箱到String不是本质上安全的操作,并且您的代码应该始终明确表示您的意图是强制转换。
    • @Cody:我完全同意你关于系统地使用Option Strict 以避免不安全操作并更新示例以鼓励这种最佳实践。
    【解决方案2】:

    你在寻找这样的东西吗?

    If Textbox.Text = string.Empty Then
    TextBox.Text = "Default Text"
    End If
    

    【讨论】:

      【解决方案3】:

      您似乎在描述一个提示横幅,它是显示在空文本框中的提示文本。从 Windows XP 开始,操作系统本身就支持此功能。这样做的效果比在TextChanged 事件中自己设置默认文本要优雅得多。它看起来像这样:

           

      通过向文本框控件发送EM_SETCUEBANNER message,在Windows API 级别完成此设置。要在 .NET 项目中使用它,您必须使用 P/Invoke。

      幸运的是,大部分工作已经为您完成。 This sample project 是一种向现有项目添加提示横幅支持的快速且轻松的方式。 Here's another sample,对过程有更完整的解释。

      如果您不希望您的应用程序依赖于外部 DLL,您可以将必要的代码直接添加到您的项目中。最简单的方法是继承现有的TextBox 控件,并在其中添加支持提示横幅的代码。有关您需要的代码,请参阅this answer。如果您在将其转换为 VB.NET 时遇到问题,请尝试this tool

      【讨论】:

        【解决方案4】:

        我会创建一个继承 TextBox 的类并用它做两件事:

        • 添加 DefaultText 字符串属性
        • 如果新的 Text 值为 String.Empty,则覆盖 Text 设置器以始终设置此 DefaultText

        【讨论】:

          【解决方案5】:

          文本框中的默认文本处理

          Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
              TextBox1.Text = "Default Text" ' initialize the text box 
          End Sub
          

          光标在文本框中时清除文本

          Private Sub TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1_GotFocus
              TextBox1.Text = "" ' clear the text box for typing
          End Sub
          

          如果文本框在数据更改后仍然为空,则默认文本再次出现

          Private Sub TextBox1_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1_LostFocus
              TextBox1.Text = "" ' clear the text box for typing
          End Sub
          

          【讨论】:

            【解决方案6】:

            我假设您打算从 aspx 页面添加文本。

            <asp:TextBox ID="TextBox1" runat="server" value="Default Value"></asp:TextBox
            

            即使.NET 不建议在智能文本中使用此功能,我假设它允许您放置任何属性,甚至是您可以在其中操作数据的自定义属性。但是,它确实有效。并且 value 属性被发送到浏览器,因此,在文本字段中启动。

            对于TextArea (TextMode="MultiLine"),可以放在标签之间。

            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine">Text Here will be inside the TextArea</asp:TextBox>
            

            这就像 html textarea 标签的行为。

            【讨论】:

              猜你喜欢
              • 2016-06-26
              • 2011-02-21
              • 1970-01-01
              • 1970-01-01
              • 2011-06-21
              • 1970-01-01
              • 1970-01-01
              • 2013-07-27
              • 2011-06-14
              相关资源
              最近更新 更多