如何能给按钮设置权限,输入正确密码后十分钟内可以随意点击,然后再次关闭?

蜗牛学编程 2020-07-03 11:54:27
各位老师,请教一个问题。
现在我想实现一个功能:为防止错误点击,需要给一个按钮设置权限(button2)。点击后弹出密码框,输入正确密码后可以解锁,十分钟之类这个按钮正常操作。十分钟后,该按钮再次锁定,必须再次输入密码才能操作。
我设计列一个form作为密码框,但遇见的问题是:
命令运行后,button2依然为不可操作,显示灰色。
另外,如何让这个button2在十分钟后再次为false?引入timer吗?这代码该如何写呢?
请老师们指点~~

if (textBox1 .Text =="123") //输入密码
{
Form4 ff = new Form4(); //让主窗体的button2可以生效

ff.button2.Enabled =true;

this.Close();
}
else
{
MessageBox.Show("密码错误,请重新输入");
}
...全文
12222 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_study001 2020-07-14
  • 打赏
  • 举报
回复
我是来学习的
  • 打赏
  • 举报
回复
最简单的办法用DialogResult 属性 主窗体

private void button1_Click(object sender, EventArgs e)
        {
          
                Form2 frm = new Form2();
                fDialogResult dr= frm .ShowDialog();
                if (dr == DialogResult.OK)
{
所有功能都可以用
       button1.可否使用=false;
       Sleep(10*1000); 设置休眠时间
        button1.可否使用=true;
}      
else
{
      所有功能不可用
      button1.可否使用=true;
}
        }
  
      
输入密码窗体

{
            if (textBox1.Text == "123456")
            {
                this.DialogResult= DialogResult.OK;
                this.Close();
            }
            else
            {
                 this.DialogResult= DialogResult.NO;
                this.Close();
            }
            this.Close();
        }
lvbinlt 2020-07-08
  • 打赏
  • 举报
回复
你跨窗体操作控件了,得用委托。
libolei 2020-07-06
  • 打赏
  • 举报
回复
如果只是实现功能 不用timer 可以这样实现 第一次点击 记录当前时间 之后的点击 比较记录的时间 判断时间差距是否大于10分钟 两个时间变量直接相减就能得到TimeSpan类型的变量 TimeSpan里就有时间差距的信息
  • 打赏
  • 举报
回复
System.Threading.Timer 额 好像是这个才对
大鱼> 2020-07-05
  • 打赏
  • 举报
回复
引用 6 楼 蜗牛学编程的回复:
[quote=引用 5 楼 一条咸鱼想翻身 的回复:]我设置的是10s,你修改一下休眠时间
您好,可以帮忙注释每行代码的含义吗?不太能理解。。。[/quote] ,奈何就用了一个委托一个线程。代码写的是比较随意(#-.-)
蜗牛学编程 2020-07-05
  • 打赏
  • 举报
回复
引用 5 楼 一条咸鱼想翻身 的回复:
我设置的是10s,你修改一下休眠时间
您好,可以帮忙注释每行代码的含义吗?不太能理解。。。
  • 打赏
  • 举报
回复
await Task.Delay(60000);


在设计和编写 UI 代码方面,现在的 .net 界面组件相关框架远没有 web 前端框架更贴近实战,相当落后和麻烦了。例如将普通对象封装为 ViewModel 对象完全可以由 Jit 编译器代劳。这方面体现了微软15年来没有一个真正的面向 UI 程序开发的系统架构师而只有一帮小工匠、只会抄袭开源小项目的设计思路的尴尬。不过瘦死的骆驼比马大,微软必经还是有点儿货的,还是有些最近6、7年的 .net 的新知识必须学习掌握的。
  • 打赏
  • 举报
回复
设计一个系统,要把界面跟界面背后所绑定的状态(数据源)分开设计,使得“可以随时替换不同的界面皮肤层”,这才是能做大系统的设计模式。例如可以这样设计 VM 部分代码
    public class 你的状态 : INotifyPropertyChanged
{
public bool 是否可用
{
get
{
return DateTime.Now < 最后解锁时间.AddMinutes(1);
}
}

string _pwd;
public string 密码
{
get
{
return _pwd;
}
set
{
_pwd = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("密码"));
}
}

public async Task 输入密码解锁(string input)
{
if (input == 密码)
{
最后解锁时间 = DateTime.Now;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("是否可用"));
await Task.Delay(1000);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("是否可用"));
}
else
密码错误?.Invoke(input);
}

private DateTime 最后解锁时间 = DateTime.Now;

public event PropertyChangedEventHandler PropertyChanged;

public event Action<string> 密码错误;
}


这里,VM状态数据(数据源)有一个只读属性“是否可用”用来展示当前是否在输入密码之后1分钟时间段之内,并且当这个属性从“不可用”与“可用”之间切换的时候会触发 PropertyChanged 事件通知宿主。同时还有一个“密码”属性用来保存、绑定、事件通知用于核对的密码。还有一个“输入密码解锁”的异步操作方法,客户程序调用它可以改变“可用”状态。

设计程序,要把 View 跟 ViewModel 分开设计。例如 WPF、Knockout、Vue 等等框架都有一整套通用的机制可以将“普通数据对象、数据集合对象”与 View 上的各种现成的控件的属性双向绑定,非常方便。那么关键就在于程序员有没有意识、懂不懂设计理念。

一个好的程序设计师,它能够用2、3种以上的 UI、UE 设计思路来测试 ViewModel 状态数据对象的设计。同一个状态对象可以适配千变万化的界面模板,而不改变业务逻辑代码。只有跟一般人“相反”的做法才是工程师的做法,而不是出血则的做法。只有少数人才能成功。
大鱼> 2020-07-04
  • 打赏
  • 举报
回复
我设置的是10s,你修改一下休眠时间
大鱼> 2020-07-04
  • 打赏
  • 举报
回复
主窗体
   bool flag = false;
        private void button1_Click(object sender, EventArgs e)
        {
            if (!flag)
            {
                Form2 frm = new Form2();
                frm.checkStatus += Frm_checkStatus;
                frm.Show();
            }
        }

        private void Frm_checkStatus(bool cflag)
        {
            flag = cflag;
            thread = new Thread(changeFlag);
            thread.Start();
        }

        Thread thread = null;

        private void changeFlag()
        {
            while (flag)
            {
                Thread.Sleep(10*1000);
                flag = false;
            }
        }
密码输入框
  public delegate void Checkpassword(bool flag);
        public event Checkpassword checkStatus;
        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "123456")
            {
                checkStatus(true);
            }
            else
            {
                checkStatus(false);
            }
            this.Close();
        }
luj_1768 2020-07-04
  • 打赏
  • 举报
回复
密码框触发按钮使能,按钮触发计时器使能并且更改密码框设置,计时器触发按钮关闭以及恢复密码框设置。仔细选好三个控件的触发事件,然后把代码写上去就行了。

111,082

社区成员

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

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

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