我有Form1
,上面有一个按钮。单击按钮后,Form2
将会打开。
弹出的新表单要求用户输入数据以保存到文件中,单击Form2
的按钮时,会将输入的用户数据保存到指定的路径。
以下是Form2
的按钮点击代码:
private void dataBaseSaveButton_Click(object sender, EventArgs e)
{
if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
{
MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
//This is where I am saving the data to a file using StreamWrriter.
this.Close();
}
现在,Form2
关闭了一个新的Form2
将会打开,等等。(Form1
中有一个循环可以执行此操作。)
在Form2
我还有一个_FormClosed
事件,如下所示:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (userAnswer == DialogResult.Yes)
this.Dispose();
}
如何调用按钮点击以正确关闭Form2
WITHOUT 调用_FormClosed
事件,同时保持表单的功能相同?
我知道this.Hide();
可以解决问题..但我想知道是否有办法不隐藏所有Form2
,因为可能会有很多......
答案 0 :(得分:3)
我认为您的应用程序有一种奇怪的行为。通常当用户输入数据行时,它在某种网格中执行。 但要回答您的问题,您应该删除事件处理:
private void Button_Click(object sender, EventArgs e)
{
this.FormClosed -= Form_Closed;
this.Close();
}
希望这能回答你的问题。
答案 1 :(得分:1)
你无法避免调用FormClosed,但你可以添加一些逻辑来忽略它。
e.g。当您强行关闭表单(类似bool _forceClose
)时设置一个标志,并在FormClosed
事件中检查该标志。如果已设置,则只返回并忽略其余的语句。
答案 2 :(得分:1)
我认为您需要更改结束事件以确定是否需要取消它:
根据您的评论,您必须将局部变量设置为标志。 CloseReason
中的FormClosedEventArgs
属性将使用关闭表单的任一方法设置为UserClosing
(尽管文档中提到了这一点)。
private bool _ConfirmClosing = true;
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (_ConfirmClosing) {
DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (userAnswer == DialogResult.No)
e.Cancel = true;
}
}
答案 3 :(得分:1)
如果您可以关闭表单,只需引入一个新的公共表单属性来保存布尔值:
public boolean CanClose { get; set; }
然后在您的构造函数中将此值设置为false
:
public Form2()
{
//....
CanClose = false;
}
保存数据后,只需将此属性设置为true
:
private void dataBaseSaveButton_Click(object sender, EventArgs e)
{
if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
{
MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
//This is where I am saving the data to a file using StreamWrriter.
CanClose = true;
this.Close();
}
最后,在结束活动中,只需检查您是否可以静默关闭表单,或者需要显示对话:
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (!CanClose)
{
DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (userAnswer != DialogResult.Yes)
{
e.Cancel = true;
return;
}
}
this.Dispose();
}
答案 4 :(得分:0)
当以编程方式调用操作时,触发事件时,Windows.Forms库通常不一致。
我建议您在表单中保留一名成员,以了解您是否要忽略该事件。
private void dataBaseSaveButton_Click(object sender, EventArgs e)
{
if (firstNameTextBox.Text.Equals(string.Empty) || lastNameTextBox.Text.Equals(string.Empty) || payTextBox.Text.Equals(string.Empty))
{
MessageBox.Show("Please fill out all of the fields.", "Fields Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
//This is where I am saving the data to a file using StreamWrriter.
this.IgnoreCloseEvent = true;
this.Close();
this.IgnoreCloseEvent = false;
}
然后
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.IgnoreCloseEvent)
return
DialogResult userAnswer = MessageBox.Show ("Do you wish to close ALL " + counterLabel.Text + " of the 'Form2' forms?", "Close ALL Forms?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (userAnswer == DialogResult.Yes)
this.Dispose();
}
必须一直这样做很痛苦,但对我来说,它总是比试图找出Windows.Forms库正在做的更好。