【问题标题】:How to set TextBox hint label in VB .NET?如何在 VB .NET 中设置 TextBox 提示标签?
【发布时间】:2011-08-12 05:43:07
【问题描述】:

在我的应用程序中,我有一个用于输入用户名的文本框。如果文本为空,我想在同一文本框中以灰色显示“在此处输入用户名”。文本框是否有这样的属性。就像在 Firefox 浏览器中一样,如果 URL 字段为空,它将以灰色显示“转到网站”

谢谢

【问题讨论】:

标签: vb.net


【解决方案1】:

我知道这可能是一个旧线程,但我想我会回答它以防万一其他人偶然发现它。

首先声明如下(可能需要导入System.Runtime.InteropServices

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As Int32
End Function

然后调用以下命令(根据需要更改):

SendMessage(Me.textbox1.Handle, &H1501, 0, "Enter User name here")

【讨论】:

  • 很好的答案,格雷厄姆夫斯!那是我一直在寻找的东西。不过,我在尝试在 form_load 事件中显示两个不同文本框的提示时遇到问题。有什么建议吗?
  • @Sev09 你能发布你的代码吗?试试SendMessage(Me.textbox2.Handle, &amp;H1501, 0, "Your second message here")。我建议创建一个新问题,并使用@Grahamvs 添加评论,以便我看到它。我还建议创建一个新类,从文本框继承,并在其中添加代码,因为这样可以更轻松地重用代码
  • 问题似乎是它是一个多行文本框。再次感谢您最初的回答。
【解决方案2】:

假设您指的是 Windows 窗体,请查看 this question
基本上,您需要使用EM_SETCUEBANNERvalue 为控件调用WinAPI SendMessage 函数。

【讨论】:

    【解决方案3】:

    我真的很喜欢 CodeProject.com 的这个解决方案:http://www.codeproject.com/KB/edit/TextBoxHint.aspx?display=Print

    真正好的是当用户在字段中输入他/她的文本时,光滑的淡出。它非常容易实现并且看起来很棒。

    【讨论】:

      【解决方案4】:

      你可以继承 TextBox 并覆盖 WndProc

      Public Class TextBoxPlaceHolder
          Inherits TextBox
          Private Const WM_PAINT As Int32 = &HF
          Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
              MyBase.WndProc(m)
              If m.Msg = WM_PAINT AndAlso Me.TextLength = 0 Then
                  Using g = Me.CreateGraphics
                      g.DrawString("Enter User name here", Me.Font, Brushes.Gray, 1, 1)
                  End Using
              End If
          End Sub
      End Class
      

      【讨论】:

      • 谢谢!这很棒,我想多次使用它,所以我在这个类中创建了一个属性: Private Hint As String Public WriteOnly Property HintText() As String Set(Value As String) Hint = Value End Set End Property 然后我覆盖了上面的硬编码文本: g.DrawString(Hint, Me.Font, Brushes.Gray, 1, 1) 在调用表单中,我使用以下方式设置提示: Form1.TextBoxPlaceHolder1.HintText = "Enter Desired Name"
      【解决方案5】:

      Ivan 和 cardmagik 的工作很棒。 创建一个用户控件并使用以下代码。

      Public Class RichTextBoxPlaceHolder
          Inherits RichTextBox
          Private Const WM_PAINT As Int32 = &HF
          Private mstrHint As String = "Enter text"
      
          Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
              MyBase.WndProc(m)
              If m.Msg = WM_PAINT AndAlso Me.TextLength = 0 Then
                  Using g = Me.CreateGraphics
                      g.DrawString(mstrHint, Me.Font, Brushes.Gray, 1, 1)
                  End Using
              End If
          End Sub
      
          Public Property Hint() As String
              Get
                  Return mstrHint
              End Get
              Set(ByVal value As String)
                  mstrHint = value
              End Set
          End Property
      
      End Class
      

      截图:

      【讨论】:

        【解决方案6】:

        尝试类似的方法:

        (onkeyup)
        If TextBox.Text = "" Then
          TextBox.Text = "Enter username here..."
          TextBox.ForeColor = <your chosen color here>
        Else 
          TextBox.ForeColor = <normal color here>
        End If
        

        【讨论】:

        • 一个坏主意。不处理鼠标点击(右键单击 -> 上下文菜单 -> 剪切不应该可用),Text 将把这个占位符作为 actual text 返回(你希望它返回 @ 987654323@)等。这样做有很多弊端。
        • 感谢您的反馈。我并不打算提供涵盖所有用例的解决方案,因为关于如何准确涵盖每个边缘情况的解释太长了。我的意图只是让皇家推动正确的方向,即。每当文本(可能)更改时更改元素 ForeColor 的想法。
        • 谢谢,但有没有这方面的财产。我不想根据 Dan Abramov 为这个 bcz 编写代码,我必须做很多验证。(如果属性不存在,我将在文本框旁边添加标签。)
        • 如果它不是你的 UI 设计的重要部分,我会说只是在文本框旁边添加标签。这要容易得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多