【发布时间】:2011-07-07 21:17:48
【问题描述】:
如果文本框为空,如何用文本填充?我正在使用 VB.NET。
【问题讨论】:
标签: .net vb.net winforms textbox
如果文本框为空,如何用文本填充?我正在使用 VB.NET。
【问题讨论】:
标签: .net vb.net winforms textbox
您可能想要处理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,几行托管代码也能满足您的所有需求。
【讨论】:
Tag 属性转换为 String。 DirectCast() 基本上等同于您的 C# 示例。
DirectCast 以使代码不那么冗长。 VB.NET 编译器在进行强制转换时非常智能,并且会自动将 Tag 属性的转换添加到 String 以及 DirectCast(如果省略)。
Object 拆箱到String不是本质上安全的操作,并且您的代码应该始终明确表示您的意图是强制转换。
Option Strict 以避免不安全操作并更新示例以鼓励这种最佳实践。
你在寻找这样的东西吗?
If Textbox.Text = string.Empty Then
TextBox.Text = "Default Text"
End If
【讨论】:
您似乎在描述一个提示横幅,它是显示在空文本框中的提示文本。从 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。
【讨论】:
我会创建一个继承 TextBox 的类并用它做两件事:
【讨论】:
文本框中的默认文本处理
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
【讨论】:
我假设您打算从 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 标签的行为。
【讨论】: