4

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

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
  }
}

我在互联网上查看并找不到任何内容,如何在 winforms 文本框中的文本以不可更改的文本为前缀?试图做类似的事情,但答案并没有真正帮助。

关于如何将前缀保留DOMAIN\在 a 中的任何想法TextBox

4

4 回答 4

13

这里指出了使用 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;
    }
于 2013-01-25T15:18:01.090 回答
1

为什么不在 textChanged 的​​事件 args 中查看之前的值和新值,如果新值Domain\中不存在,则保留旧值。

或者,为什么不将 显示Domain\为 TextBox 前面的标签,然后将其添加到后面的代码中,以便最终文本类似于Domain\<username>.

于 2013-01-25T15:08:55.867 回答
1

是的,一旦我问了这个问题,我就解决了这个问题......我不会删除这个问题,以防其他人将来有同样的问题,因为我找不到合适的答案。我设置TextDomain\然后使用该KeyPress事件。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
  e.Handled = (textBox1.GetCharIndexFromPosition(Cursor.Position) < 7);
}

一旦我提出要求,我倾向于继续工作,而不是让人们为我做所有的工作:)

于 2013-01-25T15:09:02.550 回答
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;
    }
}
于 2013-01-25T15:52:36.487 回答