prog786 Ответов: 2

Родительская форма включена во время работы дочерней формы


Всем привет

я делаю приложение на C#, в котором из родительской формы нажимаю кнопку и открывается дочерняя форма, я хочу, чтобы родительская форма оставалась активной, пока работает дочерняя форма .
Примечание:
родительская форма одно текстовое поле заполняется из дочерней формы ruing form.

пожалуйста помочь

Что я уже пробовал:

я попробовал в кнопке обработки ребенка
сделать объект родительской формы
любить
Parentform obj= новая родительская форма();
параметр obj.Активировать();

но это не работает

Ralf Meier

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

Graeme_Grant

Не заставляйте ребенка формировать модальные формы...

2 Ответов

Рейтинг:
1

OriginalGriff

Это не так просто, как вы можете подумать: это не так уж плохо, но вы должны изменить способ, которым все это работает.
Проблема почти наверняка в том, что вы делаете это:

ChildForm cf = new ChildForm();
cf.ShowDialog();
Это создает то, что называется модальной формой - вызов ShowDialog не возвращается, пока дочерняя форма не будет закрыта, - и это означает, что ваша родительская форма ничего не может сделать, пока пользователь не закончит с дочерней.

Вместо этого вы можете использовать метод Show, но это может создать свои собственные проблемы - например, что произойдет, если пользователь снова нажмет ту же кнопку?
Чтобы обойти эти проблемы, создайте частную переменную уровня класса для хранения экземпляра формы chicld:
private ChildForm child = null;
Затем в вашем обработчике кнопок проверьте это:
if (child == null)
   {
   child = new ChildForm();
   ...
   }
Теперь ваш пользователь может нажимать его столько раз, сколько ему нравится, без проблем. Но нам нужно управлять тем, как пользователь может нажать его снова! Для этого нам нужно знать, когда пользователь закрывает форму:
if (child == null)
   {
   child = new ChildForm();
   child.FormClosed += child_FormClosed;
   child.Show();
   }

И обработчик убивает экземпляр:
void child_FormClosed(object sender, FormClosedEventArgs e)
    {
    child.FormClosed -= child_FormClosed;
    child = null;
    }
Теперь родительская форма все еще может работать, пока ребенок виден.


Рейтинг:
0

BillWoodruff

Несколько иной подход.

1. Сделайте то, что вы называете "дочерней формой", собственной формой основной формы. Предположим, вы добавили вторую форму в свой проект с именем ' OwnedFormExample:

OwnedFormExample OwnedForm = new OwnedFormExample();

private void MainForm_Load(object sender, EventArgs e)
{
    OwnedForm.ShowInTaskbar = false;
    OwnedForm.Owner = this;
    OwnedForm.FormClosing += OwnedFormOnFormClosing;
}
Принадлежащая форма всегда будет отображаться вместе с формой владельца: она всегда будет отображаться над формой владельца; если вы свернете форму владельца, принадлежащая форма будет свернута.

Предположим, что кнопка на главной форме называется " btnShowOwnedFor
private void btnShowOwnedForm_Click(object sender, EventArgs e)
{
    OwnedForm.Show();
    btnShowOwnedForm.Enabled = false;
}
Щелчок показывает принадлежащую форму и отключает кнопку: вы гарантируете, что пользователь не может совершить ошибку нескольких щелчков (защитное Программирование).

Предположим, я хочу повторно использовать эту вторую форму, а не удалять ее и создавать заново каждый раз, когда я хочу ее использовать ?
        private void OwnedFormOnFormClosing(object sender, FormClosingEventArgs formClosingEventArgs)
{
    OwnedForm.Hide();

    if (formClosingEventArgs.CloseReason == CloseReason.UserClosing)
    {
        btnShowOwnedForm.Enabled = true;

        formClosingEventArgs.Cancel = true;
    }
}
Здесь FormClosing EventHandler для принадлежащей формы скрывает принадлежащую форму и, поскольку принадлежащая форма закрывается пользователем, отменяет закрытие после включения кнопки.

Вот как может выглядеть пример собственной формы:
public partial class OwnedFormExample : Form
{
    public OwnedFormExample()
    {
        InitializeComponent();
    }

    public string OwnedFormTextBoxData 
    {
        set { textBox1.Text = value; }
        get { return textBox1.Text; }
    }
}
Публичная собственность дает внешнему создателю форму собственности пример способ доступа к содержимому текстового поля ... без прямого доступа к элементу управления TextBox (инкапсуляция).

В любое время в коде формы владельца Вы можете получить доступ или установить текстовое содержимое в текстовом поле формы владельца.

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