Member 10368914 Ответов: 2

Как проверить состояние при получении данных о дочерней форме в родительской форме MDI?


Привет друзья,

Я новый разработчик, я пытаюсь найти информацию о проверке события в дочерней форме во время извлечения данных.

Пример:

Я создаю приложение (MDI form), и я создаю функцию для извлечения данных для отображения на datagridview элемента управления "дочерняя форма", но при извлечении данных имеет небольшую задержку.

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

#######

так что же мне делать? пожалуйста, дайте мне больше информации

Спасибо

Мой английский не самый сильный, извините

Годвин11

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

Если вам нужна фотография я сделаю снимок позже

спасибо

Graeme_Grant

Есть несколько способов сделать это. Что вы пробовали до сих пор? Нажмите на кнопку Улучшить вопрос для обновления кода, сообщений об ошибках, дополнительной информации и т. д.

2 Ответов

Рейтинг:
15

Graeme_Grant

Вам нужно выставить свойство в дочерних формах. Теперь MdiParent может проверить, занят ли он.

Самый простой способ-использовать интерфейс. Таким образом, вы можете иметь различные типы дочерних форм, а интерфейс облегчает опрос.

interface IFormState
{
    bool IsBusy { get; }
}

Реализация интерфейса на дочерних формах):
public partial class Form2 : Form, IFormState
{
    public Form2()
    {
        InitializeComponent();
    }

    public bool IsBusy { get; private set; }

    private void butSetBusyState_Click(object sender, EventArgs e)
    {
        IsBusy = true;
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = IsBusy;
    }
}

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

Теперь на родительской MDI :
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        var form = new Form2();
        form.MdiParent = this;
        form.Show();

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        foreach (var item in MdiChildren)
        {
            if (((IFormState)item).IsBusy)
            {
                e.Cancel = true;
                break;
            }
        }
    }
}

Как формы ребенка, родительская MDI-крючки FormClosing событие. При запуске он будет перебирать все открытые дочерние формы и отменять закрытие, если дочерняя форма занята.


Member 10368914

Извините за поздний вопрос, вы можете показать мне демо-проект?

Рейтинг:
1

KarstenK

В лучшем случае это архитектурная проблема-разработать некоторый поток данных.

Вам нужна в обработчике кнопки закрытия некоторая информация о состоянии вашего документа. Поэтому обычно вы работаете с некоторыми указателями, чтобы получить доступ, а затем вызываете функцию состояния, которая дает вам это состояние. В таких случаях часто делается некоторое "прямое объявление", чтобы избежать циклического включения заголовка.

Пример

class MyDocument;//forward declaration (without header inclusion)

class MyMainFrame
{
  MyDocument *m_pDocument;//important: only use pointers
}