我想从另一个表单访问表单的变量。单击我的主窗体内的按钮,我想将我的主窗体设置为父窗口,然后调出另一个窗体(子窗体),其中我将访问主窗体的变量。我的点击处理程序如下:
private void btnSystem_Click(object sender, EventArgs e)
{
Form_EnterPassword EP = new Form_EnterPassword();
EP.Parent = this; //error: Top-level control cannot be added to a control
EP.ShowDialog();
}
编译没有任何错误。但是,当我运行Main窗体并单击System按钮时,它会抛出异常。我在另一个代码(不是我的代码)中使用相同的按钮单击执行类似的操作,并且不会遇到任何错误(仅将主窗体设置为父窗口)。
我做错了什么?我的主代码中是否有引起此问题的内容?
答案 0 :(得分:16)
最好的方法是使用EP.ShowDialog(this)
,然后使用Owner
属性。
答案 1 :(得分:10)
您需要将EP.TopLevel
属性设置为false。它可以让你设置它的父级。
如果您只想访问其他表单的变量和控件,那么也许您可以通过其他方式访问它,而不是通过父关系。
答案 2 :(得分:1)
行, 显然,这样做的方法是致电
Form_Child.ShowDialog(this)
然后我可以打电话
FromParent_aVariable = ((Form_Parent)this.Owner).aVariable;
或者如果我在命名空间属性
中定义aVariableFromParent_aVariable = NameSpace.Properties.Settings.Default.aVariable;
有两种方式。
答案 3 :(得分:0)
Form_EnterPassword EP = new Form_EnterPassword();
EP.MdiParent = this;
EP.Show();
尝试这种方式,对我有帮助。您需要在表单属性中将Principalform设置为isMdicontainer = true
答案 4 :(得分:0)
我最近也有类似情况。 我正在尝试类似的方法,但是通过控制其他类的子窗体来实现。
注意事项:
您试图将子窗体“ TopMost”设置为不允许的值。
在这种情况下是“ MdiContainer”。
要完成此任务:
•禁用MainForm的“ isMdiContainer”属性(无论如何,它的使用已经过时了。)
•将“窗体的TopMost”属性设置为true。
•您现在应该可以完成您的功能。
/* On your Main Form Class */
private void btnSystem_Click(object sender, EventArgs e)
{
// Instantiate the Form_EnterPassword by passing the MainForm
Form_EnterPassword EP = new Form_EnterPassword(this);
EP.Show(); // No longer as modal Form to display in front.
}
/* Under your EnterPassword Form Class */
// Do not create a new Instance of MyMainForm.
// You want to use the same thread as your MainForm
private MyMainForm mainForm;
/* Constructor */
public Form_EnterPassword(MyMainForm form)
{
mainForm = form;
this.Owner = mainForm; // "this" refers to the: EnterPassword Form.
}
备注:
您(可能)要做的(达到完美)的唯一其他事情是检查MainForm> WindowState;并创建一个代码块以最小化表单或使表单进入其特定状态。
即:
if (WindowState == FormWindowState.Minimized)
{ /* Code to Minimize all the Child Forms. */ }
else { /* Code to bring all Forms to their "Normal" State */ }
答案 5 :(得分:-1)
以这种方式编写,使对话框显示在父窗体的中心。
Form_Child.StartPosition = FormStartPosition.CenterParent;
Form_Child.ShowDialog(this);