Dinesh Kumar Ответов: 2

Приложение Windows включить кнопку родительскую форму из дочерней формы


Привет,
Я пытаюсь создать свой собственный элемент управления Next/back wizard, используя несколько форм.
В этом случае я сталкиваюсь с проблемой в одном сценарии.
У меня есть кнопка next/back в родительской форме. По умолчанию следующая кнопка будет включена false после нескольких проверок в дочерней форме im пытается включить родительскую кнопку Next.
Я не могу сделать так, чтобы это произошло, я попробовал ниже код.

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

По умолчанию моя родительская форма
Шаг 1 моя детская форма

Моя попытка сделать это ниже кода из моей дочерней формы Step1:

Default d = новое значение по умолчанию();
д. btnNext.Включен = истина;

--------------------------

(этот.Владелец по умолчанию). btnNext. Enabled = true;

--------------------------

//Default p = (по умолчанию)this.Владелец;
Контроля[] с = С. Контроля.Find ("btnNext", true);
Кнопка b = (кнопка)c[0];
б.Включен = ложь;

Philippe Mori

Любое из ваших испытаний-плохой дизайн. Дочерняя форма не должна знать никаких подробностей, таких как наличие кнопки "Далее" в родительской форме. Это слишком много сцепления, и это сделает приложение менее ремонтопригодным. Кроме того, он требует, чтобы страницы знали, являются ли они последними на этой странице, вероятно, использовали бы вместо этого кнопку "Готово".

Philippe Mori

Очевидно, что ваша пробная версия №1 не может работать, поскольку вы создаете другую родительскую форму, которая не является вашим родителем. А для испытаний №2 и №3 вы, вероятно, захотите использовать ParentForm вместо Owner.
В любом случае, как уже упоминалось, это был бы плохой дизайн в любом случае.

2 Ответов

Рейтинг:
2

BillWoodruff

"Суть" потока управления в пользовательском интерфейсе" мастера " требует от вас:

1. Ведите удобный список форм мастера

2. Следите за тем, какая форма мастера является текущей формой

3. предоставьте возможность форме мастера сигнализировать основной форме при нажатии ее кнопки "Далее" или "предыдущая".

4. предоставьте логику в основной форме, чтобы получить сигнал от форм Мастера, и действуйте, чтобы показать правильную следующую форму мастера в последовательности.

Итак, давайте рассмотрим пример того, как это можно сделать:

Предположим, что это проект WinForms с основной формой, которая создает экземпляры форм мастера:

I. В формах мастера: предполагая, что у каждого есть кнопки "GoNext" и "GoPrevious

public Action GoNext;
public Action GoPrevious;

private void btnNext_Click(object sender, EventArgs e)
{
    if (GoNext != null) GoNext();
}

private void btnPrevious_Click(object sender, EventArgs e)
{
    if (GoPrevious != null) GoPrevious();
}
В основном виде:
private const int NWizardPages = 4;

private WizardForm currentWizard;
private int currentWizardPage;

private readonly List<WizardForm> WzFormList = new List<WizardForm>();

private void Form1_Load(object sender, EventArgs e)
{
    for (var i = 0; i < NWizardPages; i++)
    {
        var wz = new WizardForm();
        wz.Text = string.Format("Wizard Page: {0}", i + 1);
        wz.ControlBox = false;

        wz.GoNext = OnGoNext;
        wz.GoPrevious = OnGoPrevious;

        WzFormList.Add(wz);
        wz.Visible = false;
    }

    currentWizard = WzFormList[0];
    currentWizard.Show();
}

private void OnGoNext()
{
    currentWizard.Hide();

    currentWizardPage++;

    if (currentWizardPage == NWizardPages) currentWizardPage = 0;

    currentWizard = WzFormList[currentWizardPage];
    currentWizard.Show();
}

private void OnGoPrevious()
{
    currentWizard.Hide();

    currentWizardPage--;

    if (currentWizardPage < 0)
    {
        currentWizardPage = NWizardPages - 1;
    }

    currentWizard = WzFormList[currentWizardPage];
    currentWizard.Show();
}

// can't hide the Main Form until after it is 'Shown
private void WizardBase_Shown(object sender, EventArgs e)
{
    Visible = false;
}
Это простой пример, в котором опущены типовые задачи ... например, предоставление пользователю возможности выйти из Мастера и вернуться к основной форме ... обеспечивает необходимую логику путем:

0. a. создание списка форм Мастера и переменных, указывающих на текущий индекс текущей формы Мастера и текущей формы мастера.

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

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

2. обработчики OnGoPrevious и OnGoNext в основной форме делают все правильно, чтобы показать следующую или предыдущую форму мастера в последовательности.

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


Philippe Mori

Мастер, вероятно, не должен циклически перебирать страницы, а просто останавливаться на обоих концах.

Рейтинг:
1

Richard MacCutchan

Видеть Мастер Форм Реализации[^].