【发布时间】:2021-10-13 15:59:13
【问题描述】:
我在表单上有一个 customTextBox1。 customTextbox1 multiline is false,TextAlign设置为center.MaxLength为23,customTextBox1宽度为92.customTextBox1 Font设置为“MS ゴシック”,12F。 当我在文本框中输入“12345678901234567890123”时,文本滚动到最后一个字符。此外,当我单击文本时,文本以蓝色突出显示,我可以拖动到文本的左侧和右侧。
.NetFramework 3.5
我想要的是两件事:
1)当文本长于TextBox宽度时,我不想滚动到最后一个字符。我想在TextBox的右边距停止滚动。 例如, 当我输入“1234567890123456”时,我想显示“12345678901”,其余的溢出文本不应该显示。
2)当我点击并拖动文本时,我只想显示“12345678901” 并且想摆脱蓝色突出显示的选择。
这是我的代码
自定义文本框
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DisabledTextSelectForm
{
public partial class CustomTextBox : TextBox
{
public override bool AutoSize
{
get { return base.AutoSize; }
set { base.AutoSize = value; }
}
public CustomTextBox()
{
InitializeComponent();
}
}
}
表格1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DisabledTextSelectForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
customTextBox1.AutoSize = true;
customTextBox1.Size = new Size(92,21);
customTextBox1.Multiline = false;
customTextBox1.TextAlign = HorizontalAlignment.Center;
customTextBox1.MaxLength = 23;
customTextBox1.Font = new Font("MS ゴシック", 12F);
}
}
}
更新1:
我想做 textBox 的这种奇怪行为,因为我正在制作一个用其他不再支持的语言编写的应用程序的精确副本。所以我们必须用 C# 来编写它。这两个应用程序都将在 Windows 上运行。 在旧的应用程序中,有一个文本框,用户可以在其中输入 ID 号。
1)该文本框不显示溢出文本。 如果我输入 ("12345678901234567890123") ,它只显示 "12345678901" 但如果我单击退格 [13] 次,文本以 "1234567890" 开头。所以我知道溢出文本只是没有显示。
2)我无法像在 C# textBox 中那样左右单击和拖动文本。
不过,我设法复制了 No.1 的行为。 这是我的代码
自定义文本框
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Runtime.InteropServices;
namespace DisabledTextSelectForm
{
public partial class CustomTextBox : TextBox
{
public override bool AutoSize
{
get { return base.AutoSize; }
set { base.AutoSize = value; }
}
public bool DisabledScrolling { get; set; }
int caretPos = 0;
public CustomTextBox()
{
InitializeComponent();
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
var isDigit = char.IsDigit(e.KeyChar);
var isBackSpace = e.KeyChar == (char)Keys.Back;
var diffWidth = 0;
if (Text.Length >= 2)
{
var firstChar = TextRenderer.MeasureText(Text[0].ToString(), Font);
var secondChar = TextRenderer.MeasureText(Text.Substring(0, 2).ToString(), Font);
diffWidth = secondChar.Width - firstChar.Width;
caretPos = Width / diffWidth;
}
if (caretPos != 0 && Text.Length >= caretPos && DisabledScrolling)
{
if (isDigit)
{
Text = Text.Length < MaxLength ? Text + e.KeyChar.ToString() : Text;
}
else if (isBackSpace)
{
Text = Text.Substring(0,Text.Length - 1);
}
ScrollTo(caretPos - 1);
e.Handled = true;
}
base.OnKeyPress(e);
}
private void ScrollTo(int scrollPosition)
{
if (Text.Length >= scrollPosition)
{
Select(scrollPosition, 0);
ScrollToCaret();
}
}
}
}
表格1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DisabledTextSelectForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
customTextBox1.DisabledScrolling = true;
customTextBox1.AutoSize = true;
customTextBox1.Size = new Size(92,21);
customTextBox1.Multiline = false;
customTextBox1.TextAlign = HorizontalAlignment.Center;
customTextBox1.MaxLength = 23;
customTextBox1.Font = new Font("MS ゴシック", 12F);
}
}
}
我知道如何禁用 TextBox 中文本的点击和拖动。
【问题讨论】:
-
@OlivierRogier谢谢你的回答。但我要求一个没有任何滚动条的单行文本框。
-
我不确定您是否可以通过使用 API 和窗口消息来实现这一点,但不要这样做!您将更改文本框的预期行为。用例是什么?
-
@Steeeve 我知道这对 C# 文本框不好,但我必须这样做。我正在制作一个不再支持的用其他语言编写的应用程序的精确副本。所以我们必须用 C# 来编写它。这两个应用程序都将在 Windows 上运行。
-
因此您应该能够创建自己的custom text box control。