在文本框中隐藏密码,但最后一个字母除外

时间:2018-10-11 20:50:26

标签: c#

我想在登录屏幕上使用带遮罩(*)的文本框,但是我想用星号*遮罩每个字符,但最后键入的字母除外(在清除文字)。

例如,当密码为123且我输入1时,文本框的内容将显示为1(因为这是最后输入的字母)。但是,当我在2之后输入1时,文本框的内容将显示为*2,当我键入3时,文本框的内容将显示为{{1 }}。

但是我无法解决算法:

**3

这是我到目前为止所得到的。 private void txtPw_TextChanged(object sender, EventArgs e) { string inputString = txtPw.Text; int index = inputString.Length; // char lastChar = inputString[inputString.Length-1]; txtPw.Text = ""; tempPassword += lastChar; for(int i=0;i<(index-1);i++) { txtPw.Text += "*"; } txtPw.Text += lastChar; } 用于检查ID pw inf。 作为附加信息:Visual Studio在注释行中告诉我:tempPassword(如果有帮助)。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

虽然这不是一个完美的答案,但是如果您只允许人们更改字符串中输入的最后一个字符(即密码末尾的空格或新字母),则可以按要求屏蔽字符在末尾)。出于可用性的考虑,它还使用了一个名为“ currentPassword”的全局变量,以便您稍后检查它是否正确。

可以使用子功能进一步优化和修改此代码,以减少行数,但我尝试将其保留在一个代码中,以使复制和粘贴更加容易。

亲切的问候, 阴影

string currentPassword = "";

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            var currentInputBox = sender as TextBox; // More general way to handle inputs for a text event if using multiple text boxes all with the same function
            var inputString = currentInputBox.Text;

            if (inputString.Length > currentPassword.Length) // Adds the new letter to the global variable currentPassword and then masks the original text box used
            {
                var newChar = inputString.Substring(inputString.Length - 1);
                currentPassword += newChar;
                var newBoxText = "";
                for (int i = 0; i < currentPassword.Length - 1; i++)
                {
                    newBoxText += "*";
                }
                newBoxText += newChar;
                currentInputBox.Text = newBoxText;
            }
            else if ((inputString.Length < currentPassword.Length) && (inputString.Length > 0)) // Removes characters from the currentPassword field til it matches the length of the textbox field and then exposes a single character at the end
            {
                currentPassword = currentPassword.Remove(inputString.Length, currentPassword.Length - inputString.Length);
                var newBoxText = "";
                for (int i = 0; i < currentPassword.Length - 1; i++)
                {
                    newBoxText += "*";
                }
                newBoxText += currentPassword.Substring(currentPassword.Length - 1);
                currentInputBox.Text = newBoxText;
            }
        }

答案 1 :(得分:0)

因此,this article讨论了如何使用jQuery在Web上创建iPhone样式的密码输入框。但是,基于代码,我假设您正在尝试在WinForms或WPF中执行类似的操作。

因此,一般的解决方案需要以下条件:

  1. 拦截Control.KeyPress事件的代码
  2. 类中的一个字段,其中包含键入的文本(您在上述事件中被截获-请注意,您还需要捕获退格键)。
  3. 在文本框中短暂插入(可能是1秒钟)后插入一个字符,但将其替换为项目符号[[]]的逻辑。

因此,您最终得到两个字符串-在文本框中打印的项目符号字符串和实际字符串。如果您使用的是WPF,您甚至可以编写一个精美的值转换器来自动处理。

作为考虑,您还需要考虑如果用户选择一个子字符串并决定替换文本(您在键入时显示该特定字符)会发生什么情况?为您编写一个完全控制的控件似乎有些繁琐,但是希望这会给您一些有关如何进行的想法。