我正在尝试在文本框中输入永久前缀。就我而言,我希望有以下前缀:
DOMAIN\
因此,用户只需在域前缀后键入其用户名即可。这不是我必须做的事情,也不是追求,但我的问题更多是出于好奇。
我试图在TextChangedEvent
上提出一些逻辑来执行此操作,但这意味着我需要知道哪些字符已被删除,然后将DOMAIN\
预先附加到其输入的内容是 - 我无法弄清楚这个的逻辑,所以我不能发布我所尝试过的地方。
public void TextBox1_TextChanged(object sender, EventArgs e)
{
if(!TextBox1.Text.Contains(@"DOMAIN\")
{
//Handle putting Domain in here along with the text that would be determined as the username
}
}
我在互联网上找不到任何东西,How do I have text in a winforms textbox be prefixed with unchangable text?试图做类似的事情,但答案并没有真正帮助。
关于如何将前缀DOMAIN\
保留在TextBox
中的任何想法?
答案 0 :(得分:10)
此处指出使用KISS原则。当用户使用Ctrl + V或上下文菜单的剪切和粘贴命令时,尝试捕捉按键操作不会做任何事情。当发生任何捏造前缀的事情时,只需恢复文本:
private const string textPrefix = @"DOMAIN\";
private void textBox1_TextChanged(object sender, EventArgs e) {
if (!textBox1.Text.StartsWith(textPrefix)) {
textBox1.Text = textPrefix;
textBox1.SelectionStart = textBox1.Text.Length;
}
}
并帮助用户避免意外编辑前缀:
private void textBox1_Enter(object sender, EventArgs e) {
textBox1.SelectionStart = textBox1.Text.Length;
}
答案 1 :(得分:1)
为什么不在textChanged事件的args中看到之前的值和新值,如果新值中没有Domain\
,那么保留旧值。
或者,为什么不将Domain\
显示为TextBox前面的标签,并将其添加到代码后面,以便最终文本类似于Domain\<username>
。
答案 2 :(得分:1)
是的,一旦我提出这个问题,我就解决了这个问题......我不会删除这个问题,以防其他人在将来有同样的问题,因为我找不到合适的答案。我将Text
设置为Domain\
,然后使用KeyPress
事件。
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = (textBox1.GetCharIndexFromPosition(Cursor.Position) < 7);
}
我倾向于继续工作,而不是让人们为我做所有的工作:)
答案 3 :(得分:0)
可重用的自定义TextBox控件如何?代码中有注释
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Prefix = @"DOMAIN\";
}
}
class PrefixedTextBox : TextBox
{
private string _prefix = String.Empty;
public string Prefix
{
get { return _prefix; }
set
{
_prefix = value;
Text = value;
}
}
protected override void OnKeyDown(KeyEventArgs e)
{
// Don't allow Backspace and Delete if the only text is Prefix
if (Text == Prefix && (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete))
e.Handled = true;
// If home key is pressed set cursor just after the prefix
if (e.KeyCode == Keys.Home)
{
e.Handled = true;
SelectionStart = Prefix.Length;
}
// Don't allow cursor to be moved inside Prefix
if (SelectionStart <= Prefix.Length && (e.KeyCode == Keys.Left || e.KeyCode == Keys.Up))
e.Handled = true;
base.OnKeyDown(e);
}
protected override void OnClick(EventArgs e)
{
EnsureCursorPosition();
base.OnClick(e);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
EnsureCursorPosition();
// this was checked OnKeyDown. This prevents deleting and writing back behaviour
if (Text == Prefix && e.KeyChar == '\b')
e.Handled = true;
base.OnKeyPress(e);
}
protected override void OnKeyUp(KeyEventArgs e)
{
// Yet, some how an invalid text is entered fix it by just displaying the Prefix
if (!Text.StartsWith(Prefix))
Text = Prefix;
base.OnKeyUp(e);
}
private void EnsureCursorPosition()
{
// Never allow cursor position before Prefix
if (SelectionStart < Prefix.Length)
SelectionStart = Text.Length;
}
}