我有一个表单Form1
,从中我将Form2
显示为模态表单。从Form2
我做各种编辑和删除不同的一组值,应该在Form2
关闭后反映在Form1
。所以我做的是关闭Form2
后的RePopulateControls_in_Form1()
。由于RePopulateControls_in_Form1()
是一个漫长的过程,我想执行该方法只有当一些修改(编辑,添加,删除)发生在Form2
,而不是当Form2
刚刚打开和关闭。
这就是我在Form1
中所做的:
Form2 f = new Form2();
if (f.ShowDialog(this) == DialogResult.Something)
RePopulateControls_in_Form1()
然后在Form2中输入
private void bntEdit()
{
//If Edit?
this.DialogResult = DialogResult.Something;
}
private void bntAdd()
{
//If Add?
this.DialogResult = DialogResult.Something;
}
private void bntDelete()
{
//If Delete?
this.DialogResult = DialogResult.Something;
}
我的问题是.Something
。如果不是.None
,则关闭Form2
。我不希望Form2
被自己简单地关闭,除非用户关闭它。
如果我这样做:
//in Form1
private void Form1_Click()
{
Form2 f = new Form2();
if (f.ShowDialog(this) == DialogResult.None)
RePopulateControls_in_Form1()
}
//in Form2
private void Form2_SomeModification()
{
//If Modified?
this.DialogResult = DialogResult.None;
}
RePopulateControls_in_Form1()
未命中!
简而言之,在我的程序中,我如何告诉编译器只有在Form2
中的值被修改时才调用RePopulateControls_in_Form1()
?
注意:重新填充肯定是必需的,因为控件是动态创建的,有点复杂(实际上在Form2
中创建的是GUI控件及其标签等)。
在Form上设置dialgresult隐藏表单并从ShowDialog返回。如果你想延迟到用户执行其他动作(比如关闭表单),你应该将该状态存储为成员字段,并在form . closing的处理程序中设置dialgresult。
另外,如果你想在按下按钮时取消模态形式,你可以使用button。属性,而不是创建一个按钮。单击处理程序。
一种简单的方法可能是根本不使用dialgresult,而是使用一个不干扰表单行为的专用属性。-然后你应该能够编程任何你想要的逻辑。
我将在表单2中使用事件。当Form2关闭时触发该事件。在Form1中处理该事件将允许您执行任何想要的处理。此外,如果需要的话,您可以在参数中将Form2到Form1的一些信息传递回事件。
另一种方法是设置一个全局静态变量——可能只是一个bool。然后Form2可以根据是否进行了更改将其设置为true或false。当Form2返回时,Form1可以读取此值,如果为true,则进行处理并将其设置为false。