将窗体设置为父抛出异常“无法将顶级控件添加到控件”

时间:2012-05-24 22:16:22

标签: c# forms exception parent

我想从另一个表单访问表单的变量。单击我的主窗体内的按钮,我想将我的主窗体设置为父窗口,然后调出另一个窗体(子窗体),其中我将访问主窗体的变量。我的点击处理程序如下:

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按钮时,它会抛出异常。我在另一个代码(不是我的代码)中使用相同的按钮单击执行类似的操作,并且不会遇到任何错误(仅将主窗体设置为父窗口)。

我做错了什么?我的主代码中是否有引起此问题的内容?

6 个答案:

答案 0 :(得分:16)

最好的方法是使用EP.ShowDialog(this),然后使用Owner属性。

答案 1 :(得分:10)

您需要将EP.TopLevel属性设置为false。它可以让你设置它的父级。

Further reading.

如果您只想访问其他表单的变量和控件,那么也许您可以通过其他方式访问它,而不是通过父关系。

答案 2 :(得分:1)

行, 显然,这样做的方法是致电

Form_Child.ShowDialog(this)

然后我可以打电话

FromParent_aVariable = ((Form_Parent)this.Owner).aVariable;

或者如果我在命名空间属性

中定义aVariable
FromParent_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);