C# Winform 密码框

F_ING 2012-08-12 03:16:53
在textBox中按下一个健就显示该健 放掉就显示* 如**8 输入下一个的时候上一个就显示*
在线等 谢谢!
...全文
1322 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)
内容概要:本文详细介绍了基于C# WinForm、WebApi以及SQLServer2014构建的一个通用软件开发架平台。该架利用Visual Studio 2019作为开发环境,并集成了DevExpress 21.2.6控件库用于界面设计。文中阐述了如何通过HttpClient实现客户端与WebApi之间的数据交互,探讨了权限管理和用户认证的具体实现方式,如使用内存对象存储登录状态而非传统的Cookie机制。同时,还涉及到了数据库层面的安全措施(如密码加密)和分页查询优化技巧。此外,作者分享了一些实际开发过程中遇到的技术挑战及其解决方案,例如JSON属性大小写的匹配问题、DevExpress控件的数据绑定异常等。 适合人群:熟悉C#编程语言并对WinForm开发有一定了解的研发人员,尤其是那些正在寻找一种能够快速构建企业级应用的方法论和技术栈的人群。 使用场景及目标:适用于需要开发具有复杂业务逻辑的企业内部管理系统或对外提供的服务平台。其目的是帮助开发者掌握如何有效地组合多种技术手段来满足不同层次的需求,从而提高工作效率并降低维护成本。 其他说明:尽管文中提到的部分业务模块没有公开完整的源代码,但是通过对已有的系统管理功能的研究,仍然可以获得宝贵的经验教训。对于想要深入了解或改进此架的人来说,建议重点关注权限管理体系的设计思路以及WebApi接口的设计规范。

111,126

社区成员

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

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

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