Установить форму в качестве родительского исключения. Элемент управления верхнего уровня не может быть добавлен к элементу управления.

Я хочу получить доступ к переменным формы из другой формы. При нажатии кнопки внутри моей основной формы я хочу установить свою основную форму как родительскую, а затем открыть другую форму (дочернюю форму), в которой я буду получать доступ к переменным основной формы. Мой обработчик кликов выглядит следующим образом:

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

Компилируется нормально, без ошибок. Однако, когда я запускаю основную форму и нажимаю кнопку «Система», возникает исключение. Я делаю что-то подобное в другом коде (не моем) с тем же нажатием кнопки и не сталкиваюсь с ошибкой (только с установкой основной формы в качестве родительской).

Что я делаю не так? Есть ли что-то в моем основном коде, что вызывает это?


person CaTx    schedule 24.05.2012    source источник
comment
Я читал вокруг и не нашел ничего, что помогает. есть похожие коды, которые имеют такое же объявление настройки Parent.   -  person CaTx    schedule 25.05.2012
comment
исключение выдается сразу, когда я устанавливаю Parent.   -  person CaTx    schedule 25.05.2012


Ответы (6)


Лучшим способом было бы использовать свойство EP.ShowDialog(this), а затем использовать свойство Owner.

person Grzegorz W    schedule 24.05.2012
comment
Я меняю на .ParentForm; он выдает мне эту ошибку: свойство или индексатор «System.Windows.Forms.ContainerControl.ParentForm» не может быть назначено - оно доступно только для чтения - person CaTx; 25.05.2012
comment
Правда что. Забудьте о родителях. Просто используйте Owner. - person Grzegorz W; 25.05.2012
comment
Это сработало после того, как EP.ShowDialog(this) вызывает форму EP, и я делаю это во время события загрузки EP (дочерней формы): Copied_MySettings = ((Form_Parent)this.Owner).MySettings. Однако после этого события я не могу получить доступ к «Моим настройкам» из родительской формы. Кто-нибудь знает, почему? - person CaTx; 26.12.2012

Вам нужно, чтобы свойство EP.TopLevel было установлено в false. Это позволит вам установить для него родителя.

Дополнительная литература.

Если вы хотите получить доступ только к переменным и элементам управления другой формы, то, возможно, вы можете получить к ним доступ другими способами, а не через родительские отношения.

person Matzi    schedule 24.05.2012
comment
EP.TopLevel = false --› не помогает. - person CaTx; 25.05.2012
comment
Я думаю, что это должно было быть принято как правильный ответ. Это сделало работу за меня. Спасибо ;) - person Javid; 26.03.2014

Хорошо, по-видимому, способ сделать это - позвонить

Form_Child.ShowDialog(this)

и тогда я могу позвонить

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

или если я определяю aVariable в свойствах пространства имен, то

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

есть два пути.

person CaTx    schedule 25.02.2013

Form_EnterPassword EP = new Form_EnterPassword();
EP.MdiParent = this;       
EP.Show();

попробуй так, мне помогает. вам нужно установить основную форму как isMdicontainer = true в свойствах формы

person Wady Nicudemos    schedule 29.10.2018

У меня недавно была аналогичная ситуация. Я пытался сделать что-то подобное, но управляя дочерними формами из другого класса.

Примечание(я). Вы пытаетесь установить TopMost дочерней формы (форм) на что-то, что не позволяет это сделать.
В данном случае MdiContainer.


Для этого:

• Отключить свойство MainForm isMdiContainer (его использование в любом случае устарело).

• Установите для свойств TopMost форм(ы) значение true.

• Теперь вы должны быть в состоянии выполнить свою функцию.


**Code Example:**
/* 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 */ }
person John Connor    schedule 23.01.2020

При таком написании диалоговое окно отображалось в центре родительской формы.

   Form_Child.StartPosition = FormStartPosition.CenterParent;
   Form_Child.ShowDialog(this);
person bharath    schedule 02.02.2016