Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从mdi中的子窗体设置父窗体的变量_C#_Variables_Scope_Mdi - Fatal编程技术网

C# 从mdi中的子窗体设置父窗体的变量

C# 从mdi中的子窗体设置父窗体的变量,c#,variables,scope,mdi,C#,Variables,Scope,Mdi,在mdi类型的程序中,如何将公共bool从子窗体切换为true 我有一个名为logon的子表单,如果所有内容都已签出,我希望在form1(主)表单中将“authenticated”bool设置为true,您可以创建一个包含主表单的全局可访问变量,然后在子表单中使用该变量调用主表单上的方法 或者,您可以将子窗口的适当父属性或所有者属性强制转换为主窗体的适当类型,并从主窗体开始工作。您可以创建一个保存主窗体的全局可访问变量,然后在子窗体中使用该变量调用主窗体上的方法 或者,您可以将子窗口的适当父窗口

在mdi类型的程序中,如何将公共bool从子窗体切换为true


我有一个名为logon的子表单,如果所有内容都已签出,我希望在form1(主)表单中将“authenticated”bool设置为true,您可以创建一个包含主表单的全局可访问变量,然后在子表单中使用该变量调用主表单上的方法


或者,您可以将子窗口的适当父属性或所有者属性强制转换为主窗体的适当类型,并从主窗体开始工作。

您可以创建一个保存主窗体的全局可访问变量,然后在子窗体中使用该变量调用主窗体上的方法


或者,您可以将子窗口的适当父窗口或所有者属性强制转换为主窗体的适当类型,并从主窗体开始工作。

正确、真正的OO方法是在子窗体上公开父窗口可以附加到的事件。如果您让子窗体对其
mdipherent
进行假设,则违反了关注点分离

例如,执行您描述的操作的一个非常简单的方法是在您的子表单上使用以下内容:

public event EventHandler Authenticated;
当父对象打开它时

YourForm newForm = new YourForm();

newForm.Authenticated += new EventHandler(newForm_Authenticated);

newForm.MdiParent = this;

// and so on 
您还可以向子窗体添加一个
Authenticated
boolean属性,并将事件重命名为
AuthenticatedChanged
,从而稍微复杂一点(我的意思是稍微复杂一点)。然后可以使用相同的事件处理程序检查属性的值,以确定用户是否已通过身份验证


在这两种情况下,只要在希望父窗体更新时从子窗体引发事件即可。

正确、真正的OO方法是在子窗体上公开父窗体可以附加到的事件。如果您让子窗体对其
mdipherent
进行假设,则违反了关注点分离

例如,执行您描述的操作的一个非常简单的方法是在您的子表单上使用以下内容:

public event EventHandler Authenticated;
当父对象打开它时

YourForm newForm = new YourForm();

newForm.Authenticated += new EventHandler(newForm_Authenticated);

newForm.MdiParent = this;

// and so on 
您还可以向子窗体添加一个
Authenticated
boolean属性,并将事件重命名为
AuthenticatedChanged
,从而稍微复杂一点(我的意思是稍微复杂一点)。然后可以使用相同的事件处理程序检查属性的值,以确定用户是否已通过身份验证


在任何一种情况下,只要在希望父窗体更新时从子窗体引发事件即可。

由于我注意到您正在使用“登录”窗体,您可以尝试以下操作:根据用户名/密码测试成功设置登录窗体的DialogResult属性。我使用username/pass作为示例。 在登录表单上执行以下操作:

if(isMatch(username, password)){
  this.DialogResult=DialogResult.OK;
  this.Close();
}
else MessageBox.Show("Logon error - try again!");
// or anything else you would like to do in case of an error
然后在父窗体上:

LogonForm f = new LogonForm();
if(f.ShowDialog() == DialogResult.OK){
// continue
}
else {
// abort
}

由于我注意到您正在使用“登录”表单,您可以尝试以下操作:根据用户名/密码测试成功设置登录表单的DialogResult属性。我使用username/pass作为示例。 在登录表单上执行以下操作:

if(isMatch(username, password)){
  this.DialogResult=DialogResult.OK;
  this.Close();
}
else MessageBox.Show("Logon error - try again!");
// or anything else you would like to do in case of an error
然后在父窗体上:

LogonForm f = new LogonForm();
if(f.ShowDialog() == DialogResult.OK){
// continue
}
else {
// abort
}

我不确定你所说的保留主窗体是什么意思?我不确定你所说的保留主窗体是什么意思?完美的答案,你击败了我。我想这正是我想要的,但我有点不清楚——我在第三行代码中得到一个错误,上面写着(在我的登录中)newform_);在当前上下文中不存在--如果这是一个文本框或古装用户控件,我会明白该怎么做,因为我只需在设计引擎视图中单击“偶数”并完成它,但由于该窗体不在父窗体中,我不确定如何制作古装活动,请您解释更多(再次感谢)崩溃,那句话只是一个例子。通常,只要键入+=然后按tab键,VisualStudio就会自动为您“绘制”一个新的事件处理程序。newForm_Authenticated很可能是它将创建的方法的名称。它确实(这很奇怪,因为这正是我作为文本所做的,但现在它似乎喜欢它)还有一个问题,来自登录表单,我如何触发事件?完美的答案,我想这正是我想要的,但我有点不清楚——我在第三行代码中得到一个错误,上面写着(在我登录的情况下)newform_);在当前上下文中不存在--如果这是一个文本框或古装用户控件,我会明白该怎么做,因为我只需在设计引擎视图中单击“偶数”并完成它,但由于该窗体不在父窗体中,我不确定如何制作古装活动,请您解释更多(再次感谢)崩溃,那句话只是一个例子。通常,只要键入+=然后按tab键,VisualStudio就会自动为您“绘制”一个新的事件处理程序。newForm_Authenticated很可能是它将创建的方法的名称。它确实(这很奇怪,因为这正是我作为文本所做的,但现在它似乎很喜欢它)还有一个问题,来自登录表单,我如何触发事件?