【问题标题】:Textbox padding文本框填充
【发布时间】:2011-06-21 15:28:51
【问题描述】:

我在互联网上搜索过,我一定是使用了错误的关键字,因为我找不到任何东西。我想创建一个文本框,其中的文本从离左侧稍远的地方开始。

就这样。

【问题讨论】:

    标签: c# .net winforms textbox padding


    【解决方案1】:

    嗯,你可以 TrimLeft,然后用 5 个空格连接。或者,您可以设置一个自定义 UserControl,将无边框 TextBox 作为实际条目元素,覆盖另一个没有制表位的 TextBox,并在获得焦点时将焦点转移到无边框的文本框。

    【讨论】:

      【解决方案2】:

      您很可能已经发现,Winforms 文本框没有填充属性。由于面板确实公开了 Padding 属性,因此一种技术是:

      1. 创建面板
      2. 设置其边框以匹配文本框(例如,Fixed3D)
      3. 设置其背景颜色以匹配文本框(例如,白色或窗口)
      4. 将其填充设置为您满意的值(例如,10,3,10,3)
      5. 在面板内添加一个文本框
      6. 将文本框的边框设置为无
      7. 使用文本框的 Dock 和 Anchor 属性确实获得了预期的效果

      这应该可以帮助您入门。您还可以创建一个执行上述相同操作的自定义控件。

      如果您在 asp.net 中谈论文本框,请使用 CSS:
      input[type="text"] {padding: 3px 10px}

      【讨论】:

      • 唯一的问题是,对于许多较新的 Windows 皮肤,TextBox 上的 Fixed3D 看起来与 Panel 上的不同。
      • 最好将您的面板设置为具有聚焦在文本框中的点击事件。由于这个新的填充区域似乎是文本框的一部分,因此如果用户单击它并且永远不会将焦点放在文本框上,它可能会使用户离开。
      • @AdamPlocher 如果是 asp.net :)
      【解决方案3】:

      这个问题已经推荐了答案。无论如何,我想提出替代答案。要在 C# 中为文本框添加填充,可以使用“padLeft”方法。希望这对某人有所帮助。

      textBox1.Text = "Hello";
      textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5);
      
      or
      
      textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5, '*');
      

      【讨论】:

      • 不幸的是,这有一些不好的缺点。例如,可以通过左侧填充退格。 :(
      • 我发现这个解决方案非常有用,因为我使用的是只读文本框,因此不会发生退格。
      • @Christian 在这种情况下,您可以使用TextChanged() 在每次更改时设置PadLeft。这样它就不能低于它。
      【解决方案4】:

      好的,这是一个合适的解决方案。首先将 TextBox 控件的 Multiline 设置为 true

      需要使用语句:

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

      代码:

      private const int EM_SETRECT = 0xB3;
      
      [DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
      private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect);
      
      [StructLayout(LayoutKind.Sequential)]
      private struct RECT
      {
          public readonly int Left;
          public readonly int Top;
          public readonly int Right;
          public readonly int Bottom;
      
          private RECT(int left, int top, int right, int bottom)
          {
              Left = left;
              Top = top;
              Right = right;
              Bottom = bottom;
          }
      
          public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
          {
          }
      }
      public void SetPadding(TextBox textBox, Padding padding)
      {
          var rect = new Rectangle(padding.Left, padding.Top, textBox.ClientSize.Width - padding.Left - padding.Right, textBox.ClientSize.Height - padding.Top - padding.Bottom);
          RECT rc = new RECT(rect );
          SendMessageRefRect(textBox.Handle, EM_SETRECT, 0, ref rc);
      }
      

      现在这样调用:

      SetPadding(myTextBox, new Padding(5, 5, 5, 5));
      

      当然,最好是创建自己的 TextBox 控件,它可以自动将Multiline 设置为 true 并停止文本中不需要的换行等。

      【讨论】:

      • 此解决方案是否适用于 Windows 10 文本框样式?在我的 Windows 10 安装中,无论选择何种 BorderStyle,此答案中的代码都没有明显效果。
      【解决方案5】:

      我知道这有点老了。但这里有一个解决方案。对于初始文本,在开头添加一个空格。然后,您可以覆盖OnKeyPress 事件并添加以下代码,以便您无法退格。

      protected override void OnKeyPress (KeyPressEventArgs e) {
         base.OnKeyPress (e);
         if (e.KeyChar == (char)Keys.Back && Text.Length == 1) e.Handled = true;
         else e.Handled = true;
      }
      

      您可以将 1 替换为要填充的空格数。

      【讨论】:

        【解决方案6】:

        扩展上述响应以及能够通过填充值退格的感知缺陷。文本框的 SelectionStart 属性可用于确定触发 TextChanged 事件时光标的位置。

        在此示例中,文本框在开头用 2 个空格填充,以便显示的信息与使用填充属性的其他非输入控件对齐。

            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                int pad = 2;
                int cursorPos = textBox1.SelectionStart;
                textBox1.Text = textBox1.Text.Trim().PadLeft(textBox1.Text.Trim().Length + pad);
                textBox1.SelectionStart = (cursorPos > pad ? cursorPos : pad);
            }
        

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 2013-03-20
          • 2017-07-26
          • 2014-10-11
          相关资源
          最近更新 更多