C# Winform 密码框

F_ING 2012-08-12 03:16:53
在textBox中按下一个健就显示该健 放掉就显示* 如**8 输入下一个的时候上一个就显示*
在线等 谢谢!
...全文
1261 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xie398354536 2013-03-04
  • 打赏
  • 举报
回复
。。。21楼的s不能输 以及只处理了只能一次输对密码 不能修改 我对其中进行了部分修改 里面还是有蛮多bug的因为找到其他方法了 就没处理了 先把这代码贴下
 /// <summary>
        /// 用于记录密码
        /// </summary>
        private StringBuilder StrPassword = new StringBuilder();
        private void password_KeyDown(object sender, KeyEventArgs e)
        {
            if (password.Text.Length > 0)
            {
                if (e.KeyValue == 46)
                {
                    if (password.SelectionStart >= password.Text.Length)
                    {
                        return;
                    }
                    else
                    {
                        isDel = true;
                        if (password.SelectionStart != 0)
                        {
                            mouseStart = password.SelectionStart;
                        }
                        else
                        {
                            mouseStart = 0;
                        }
                        int leg = password.SelectionLength == 0 ? 1 : password.SelectionLength;
                        try
                        {
                            password.Text = password.Text.Remove(mouseStart, leg - 1);
                            StrPassword.Remove(mouseStart, leg);
                        }
                        catch
                        {
                        }
                        password.SelectionStart = mouseStart;
                    }
                }
                else
                {
                    if ((int)e.KeyValue == 22 || e.KeyValue == 24 || e.KeyValue == 3 && e.KeyValue == 8 && e.KeyValue == 13)
                    { }
                    else if (password.SelectionLength > 0)
                    {
                        isResetPWD = true;
                        resetPWD = password.SelectionLength;
                        mouseStart = password.SelectionStart;
                        StrPassword.Remove(mouseStart, resetPWD);
                    }
                    isDel = false;
                }
            }
        }
        bool isResetPWD = false;//选择部分密码时输入密码
        bool isDel = false;
        int mouseStart = 0;
        int resetPWD = 0; //选中部分密码时选中的长度
        bool cando = true;
        bool isback = false; //是否按的是后退
        private void password_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (password.SelectionStart == password.Text.Length)
            {
                cando = true;
            }

            if ((int)e.KeyChar == 22 || e.KeyChar == 24 || e.KeyChar == 3 && e.KeyChar == 8 && e.KeyChar == 13)
            {
                e.Handled = true;
                cando = false;
            }
            if (e.KeyChar == 8)
            {
                if (password.SelectionStart == 0 && password.SelectionLength == 0)
                {
                    return;
                }
                else
                {
                    isback = true;
                    mouseStart = password.SelectionStart;
                    try
                    {
                        if (password.SelectionLength == 0)
                        {
                            password.Text = password.Text.Remove(mouseStart - 1, 1);
                            StrPassword.Remove(mouseStart - 1, 1);
                            password.SelectionStart = mouseStart - 1;
                        }
                        else
                        {
                            password.Text = password.Text.Remove(mouseStart, password.SelectionLength);
                            StrPassword.Remove(mouseStart, password.SelectionLength);
                            password.SelectionStart = mouseStart;
                        }
                    }
                    catch
                    {
                    }

                }
            }
            else
            {

                isback = false;
            }
        }

        private void password_KeyUp(object sender, KeyEventArgs e)
        {
            if (password.Text == "")
            {
                StrPassword.Length = 0;
            }
        }

        private void password_TextChanged(object sender, EventArgs e)
        {
            if (!cando)
            {
                return;
            }
            if (password.Text.Trim().Length > 0 && !isback && !isDel)
            {
                isback = false;
                isDel = false;
                if (isResetPWD)
                {
                    string ss = password.Text.Substring(mouseStart, 1);
                    if (ss != "*")
                    {
                        string endstr = StrPassword.ToString().Insert(mouseStart, ss);
                        StrPassword = new StringBuilder(endstr);
                    }
                    if (password.Text.Length > 1)
                    {
                        string sstart = password.Text.Substring(0, 1);
                        if (sstart != "*")
                        {
                            StrPassword.Append(ss);
                            password.Text = password.Text.Trim().Replace(sstart, "*");
                        }
                    }
                    isResetPWD = false;
                }
                string s = password.Text.Substring(password.Text.Length - 1, 1);
                if (s != "*")
                    StrPassword.Append(s);
                if (password.Text.Length > 1)
                {
                    string sstart = password.Text.Substring(0, 1);
                    if (sstart != "*")
                    {
                        StrPassword.Append(s);
                        password.Text = password.Text.Trim().Replace(sstart, "*");
                    }
                }
                password.Text = password.Text.Trim().Replace(s, "*");

                password.SelectionStart = password.Text.Length;
            }
        }
月夜csdn 2012-08-13
  • 打赏
  • 举报
回复
可以用文本框的key_up,与key_down两个事件配合着来完成。也可以用字符串的函数操作来实现。具体做法会有很多。具体做法,自己解决了,才会体会到解决问题的兴奋。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复

StringBuilder sb = new StringBuilder();
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (textBox1.Text.Trim().Length > 0)
{
string s=textBox1.Text.Substring(textBox1.Text.Length-1,1);
sb.Append(s);

textBox1.Text=textBox1.Text.Trim().Replace(s,"*");
textBox1.SelectionStart = textBox1.Text.Length;
}
}
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

这样啊
那确实简单了
[/Quote]

水平低
只能到处吹吹水而已



  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
这样啊
那确实简单了
[/Quote]青鸟,到处都看见你撒
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
这样啊
那确实简单了


ohkuy 2012-08-13
  • 打赏
  • 举报
回复
我说简单是我曾经实现过类似的,
我说了先要过滤无效字符和操作,
只有当光标在最后一个字符,backspace才可用,
就是说只能删除最后一个字符,
其它操作包括复制,粘贴,剪切,从中间插入等都是无效的
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

引用 9 楼 的回复:

这个可以实现!

没那么好实现的

很好实现的,
在textChaned事件中先将无效值都过滤掉,
输入的时候只保留最后一位,其它都替换成"*",
密码没多长,这个效率可以忽略,
当文本框没有焦点时,全部都替换成"*"
[/Quote]

你考虑得太少了
我8楼的代码
虽然给出了替换星号的方法
但没有给出保存正确值的代码
因为
确实不好处理:
先来个简单的
1. 我把光标移到中间,然后按一下删除键,再输入其他字符,你怎么处理?
2. 我用鼠标从中间剪切一段字符串,你怎么处理?
3. 我用鼠标从中间覆盖替换一段字符串,你怎么处理?

简单吧,还有其他操作呢


ohkuy 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

这个可以实现!

没那么好实现的
[/Quote]
很好实现的,
在textChaned事件中先将无效值都过滤掉,
输入的时候只保留最后一位,其它都替换成"*",
密码没多长,这个效率可以忽略,
当文本框没有焦点时,全部都替换成"*"
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这不是手机输入框的做法嘛
[/Quote]
确实只有那种老式按键的手机才有做这个的必要,pc里根本不需要
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

这个可以实现!
[/Quote]
没那么好实现的


cry222222 2012-08-13
  • 打赏
  • 举报
回复
这个可以实现!
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
    public class MyTextBox : TextBox
{
private Timer _Timer;

public MyTextBox()
{
this.KeyUp += TextBoxKeyUp;

_Timer = new Timer();
_Timer.Tick += Tick;
_Timer.Interval = 200;
}

private void TextBoxKeyUp(object sender, EventArgs e)
{
_Timer.Start();
}

private void Tick(object sender, EventArgs e)
{
_Timer.Stop();
Text = new String('*', Text.Length);
this.SelectionStart = Text.Length;
}
}


原来的值怎么保存呢?


senekis 2012-08-13
  • 打赏
  • 举报
回复
我帮你写一段吧,你稍等
  • 打赏
  • 举报
回复
定义一个string变量用来存真正的密码,然后在textbox事件里,将密码前n-1位replace成"*",只显示最后一位。当textbox失去焦点的时候,所有的密码都显示"*"。
senekis 2012-08-13
  • 打赏
  • 举报
回复
就是文本框事件里,将用户输入的字符用*号replace掉,自己声明一个字符串来保存用户的实际输入
bdmh 2012-08-13
  • 打赏
  • 举报
回复
类似这样,自己完善吧

private void textBox3_KeyDown(object sender, KeyEventArgs e)
{
if (textBox3.Tag == null)
{
textBox3.Tag = e.KeyCode.ToString();
}
else
{
string str = "";
str = str.PadLeft(textBox3.Tag.ToString().Length, '*') + e.KeyCode.ToString();
textBox3.Text = str;
textBox3.Tag = textBox3.Tag.ToString() + e.KeyCode.ToString();
}
}
chentian2456 2012-08-13
  • 打赏
  • 举报
回复
你可以在输入下一个的时候 把上一个存储到一个数组或者其他地方啊 然后将这个替换成*
比如输入 1 然后输入 2 将1存起来,再把1用*换掉,依次类推
SocketUpEx 2012-08-13
  • 打赏
  • 举报
回复
这不是手机输入框的做法嘛


加载更多回复(12)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧