【问题标题】:How to set the Text of a TextBox to a default value如何将文本框的文本设置为默认值
【发布时间】:2021-08-18 14:44:35
【问题描述】:

我可能无法正确解释此问题,但假设我的 TextBox 在“MM/DD/YYYY”中有一个文本,该文本已在其属性上进行了编辑。我想知道一旦没有选择 TextBox 将如何再次回到该文本。一旦 TextBox 被单击,我尝试对其进行编码,文本将自行清除,但我想知道它将如何再次回到该文本。对不起,我的英语很烂,但希望你能理解。

 Private Sub birthdate_Click(sender As Object, e As EventArgs) Handles birthdate.Click
    birthdate.Clear()
End Sub

这是我单击 TextBox 时的代码,它将清除 Text 本身。这会让你明白我在说什么

【问题讨论】:

标签: vb.net winforms textbox


【解决方案1】:

这是一个扩展模块,它向 TextBox 和 ComboBox 控件添加了一个方法,用于激活 Cue Banner1 内部功能。对于 TextBox,有两种可用的风格:提示横幅是可见的:a) 直到控件获得焦点,b) 在输入第一个字符后。
ComboBox 控件在收到焦点或打开DropDown 后立即移除提示横幅。

Win32函数SendMessage用于修改Edit控件的行为——TextBox控件和ComboBox的Edit子控件,分别发送EM_SETCUEBANNERCB_SETCUEBANNER消息。

1设置文本提示或提示,由 用于提示用户输入信息的编辑控件。


由于这些是扩展方法,每个方法扩展控件功能并且可以直接调用:

' The Cue Banner is visible until the control gets focus
TextBox1.SetCueBanner("MM/DD/YYYY", False)

' The Cue Banner is visible until a character is entered
TextBox1.SetCueBanner("User Name...", True)

ComboBox1.SetCueBanner("Select an item...")

在项目中添加一个模块并用这个替换模板生成的代码:

VB.Net 版本:

Public Module ModExtentions

    Private Const EM_SETCUEBANNER As Integer = &H1501
    Private Const CB_SETCUEBANNER As Integer = &H1703

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Private Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
    End Function

    <Extension()>
    Public Sub SetCueBanner(tbox As TextBox, ByVal text As String, ByVal showOnFocus As Boolean)
        If tbox.IsHandleCreated Then SendMessage(tbox.Handle, EM_SETCUEBANNER, If(showOnFocus, 1, 0), text)
    End Sub

    <Extension()>
    Public Sub SetCueBanner(cbo As ComboBox, ByVal text As String)
        If cbo.IsHandleCreated Then SendMessage(cbo.Handle, CB_SETCUEBANNER, 0, text)
    End Sub
End Module

C#版本:

using System.Runtime.InteropServices;
using System.Windows.Forms;

public static class ExtControls
{
    private const int EM_SETCUEBANNER = 0x1501;
    private const int CB_SETCUEBANNER = 0x1703;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, string lParam);

    public static void SetCueBanner(this TextBox tbox, string text, bool showOnFocus) {
        if (tbox.IsHandleCreated) {
            SendMessage(tbox.Handle, EM_SETCUEBANNER, showOnFocus ? 1 : 0, text);
        }
    }

    public static void SetCueBanner(this ComboBox cbo, string text) {
        if (cbo.IsHandleCreated) {
            SendMessage(cbo.Handle, CB_SETCUEBANNER, 0, text);
        }
    }
}

【讨论】:

  • IsHandleCreated 应在访问Handle 之前检查。
  • @Loathing 我同意这一点。代码已更新。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多