TextBox中的永久前缀

时间:2013-01-25 15:00:40

标签: c# winforms

我正在尝试在文本框中输入永久前缀。就我而言,我希望有以下前缀:

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中的任何想法?

4 个答案:

答案 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;
    }
}