11

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

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();
}

它编译得很好,没有任何错误。但是,当我运行主窗体并单击系统按钮时,它会引发异常。我在另一个代码(不是我的)中使用相同的按钮单击做了类似的事情,并且没有遇到任何错误(只是将主窗体设置为父窗体)。

我究竟做错了什么?我的主要代码中有什么导致这种情况吗?

4

6 回答 6

18

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

于 2012-05-24T22:21:47.757 回答
10

您需要将该EP.TopLevel属性设置为 false。它会让你为它设置一个父级。

进一步阅读。

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

于 2012-05-24T22:22:00.173 回答
1

好的,显然这样做的方法是调用

Form_Child.ShowDialog(this)

然后我可以打电话

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

或者如果我在命名空间属性中定义 aVariable 那么

FromParent_aVariable = NameSpace.Properties.Settings.Default.aVariable;

有两种方法。

于 2013-02-25T22:51:06.657 回答
0

我最近也有类似的情况。我正在尝试类似的事情,但通过控制来自不同班级的子表单。

注意(S): 您正在尝试将子表单“TopMost”设置为不允许它的东西。
在这种情况下,“MdiContainer”。


要做到这一点:

• 禁用 MainForm 的“isMdiContainer”属性(无论如何,它的使用已经过时了)。

• 将Form(s) 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;并创建一个代码块以最小化或使表单进入其特定状态。

IE:

if (WindowState == FormWindowState.Minimized)
{ /* Code to Minimize all the Child Forms. */ }

else { /* Code to bring all Forms to their "Normal" State */ }
于 2020-01-23T13:11:57.973 回答
0
Form_EnterPassword EP = new Form_EnterPassword();
EP.MdiParent = this;       
EP.Show();

试试这种方式,它对我有帮助。您需要在表单属性中将 principalform 设置为 isMdicontainer = true

于 2018-10-29T16:37:58.323 回答
-1

这样写,使对话框显示在父窗体的中心。

   Form_Child.StartPosition = FormStartPosition.CenterParent;
   Form_Child.ShowDialog(this);
于 2016-02-02T03:40:37.277 回答