我正在尝试从另一种形式收听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
的不同实例,但我不会在任何地方创建新实例。我在这里做错了什么?
答案 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();
}