从另一个表单启用按钮

时间:2017-09-11 06:21:58

标签: c# winforms button

我正在尝试从另一种形式收听FormClosed事件,但奇怪的是没有工作。

Ribbon1.cs

public partial class Ribbon1
{
    public static Token Token;
    private LoginForm LoginForm;

    private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
    {
        Token = new Token();
        LoginForm = new LoginForm();
        LoginForm.FormClosedEventListener += new LoginForm.LoginFormEvent(LoginForm_Closed);
        LoginButton.Enabled = true;
    }

    void LoginForm_Closed()
    {
        this.LoginButton.Enabled = true;
    }

    private void TestBtn_Click(object sender, RibbonControlEventArgs e)
    {

        this.LoginButton.Enabled = true;
    }

    private void LoginButton_Click(object sender, RibbonControlEventArgs e)
    {
        LoginForm.ShowDialog();
        this.LoginButton.Enabled = false;
    }

LoginForm.cs

    public delegate void LoginFormEvent();

    public event LoginFormEvent FormClosedEventListener; 

    public LoginForm()
    {
        InitializeComponent();
        this.FormClosed += new FormClosedEventHandler(LoginForm_Closed);
    }

    private void LoginForm_Closed(object sender, FormClosedEventArgs e)
    {
        FormClosedEventListener();
    }

这很奇怪,因为我无法通过收听LoginButton事件从Ribbon1.cs启用LoginForm_Closed。但是,我可以通过单击同一Ribbon.c中的TestBtn来关闭它。就好像我正在针对Ribbon1.cs的不同实例,但我不会在任何地方创建新实例。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

试试这个

此代码将在登录表单关闭时调用功能区类中的事件并启用按钮

 private void LoginButton_Click(object sender, EventArgs e)
        {
            this.LoginButton.Enabled = false;
            LoginForm.ShowDialog();            
        }

    private void Ribbon_Load(object sender, EventArgs e)
            {
                LoginForm = new LoginForm();
                LoginForm.FormClosed += LoginForm_Closed;               
            }


    void LoginForm_Closed(object sender, FormClosedEventArgs e)
            {
                this.LoginButton.Enabled = true;
            }

答案 1 :(得分:1)

当你看一下它所说的documentation of ShowDialog时:

  

打开一个窗口,仅在新打开的窗口关闭时返回。

这意味着LoginButton_Click中的第二行只会在LoginForm关闭时执行。

private void LoginButton_Click(object sender, RibbonControlEventArgs e)
{
    LoginForm.ShowDialog();
    this.LoginButton.Enabled = false;
}

因此,当表单关闭并且已注册的FormClosedEventListener事件启动以启用该按钮时,它将在执行第二行后被禁用

解决方案:尝试使用Show方法。它是非阻塞的:

private void LoginButton_Click(object sender, RibbonControlEventArgs e)
{
    LoginForm.Show();
    this.LoginButton.Enabled = false;
}

修改

  

我必须使用ShowDialog(),因为我想阻止其他表单的可访问性

然后我会先禁用按钮然后再调用ShowDialog。只需切换线条:

private void LoginButton_Click(object sender, RibbonControlEventArgs e)
{
    this.LoginButton.Enabled = false;
    LoginForm.ShowDialog();
}