Перейдите от дочерней формы к форме родного брата - PullRequest
3 голосов
/ 16 января 2012

В родительской форме A есть следующий код для вызова дочерней формы "B":

        Window frmChildB;
        frmChildB = new FormB();
        frmChildB.ShowDialog();

В той же форме: следующий код для вызова дочерней формы "C":

        Window frmChildC;
        frmChildC = new FormC();
        frmChildC.ShowDialog();

Теперь я хочу сделать кнопку в форме B, чтобы, если я нажму эту кнопку, она автоматически переместилась в форму C.

Использование эталонного объекта формы C в форме B подобнов ответе на этот вопрос следует по возможности избегать.Причина в том, что существует более десяти форм, таких как B, C ... и каждая из них должна быть в состоянии перейти к другой.Наличие 10 объектов с ссылками на формы внутри формы не очень хорошо.

Я думаю, что должен быть какой-то способ добиться эффекта.Кто-нибудь знает об этом?

Ответы [ 3 ]

1 голос
/ 16 января 2012

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

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

Вот пример этого класса (он потребует некоторой дополнительной работы, но должен дать вам хорошее представление):

public class FormManager
{
    private static FormB m_FormB;
    public static FormB formB
    {
        get
        {
            if (m_FormB == null)
            {
                m_FormB = new FormB();
            }
            return m_FormB;
        }
    }
    private static FormC m_FormC;
    puClic static FormC formC
    {
        get
        {
            if (m_FormC == null)
            {
                m_FormC = new FormC();
            }
            return m_FormC;
        }
    }

    public enum FormId
    {
        FormB,
        FormC
    }

    public static Form ShowForm(FormId whichForm)
    {
        Form oForm;

        switch (whichForm)
        {
            case FormId.FormB:
                oForm = FormManager.formB;
                break;

            case FormId.FormC:
                oForm = FormManager.formC;
                break;

            default:
                oForm = null;
                break;
        }

        if (oForm != null)
        {
            oForm.ShowDialog();
        }
        return oForm;
    }
}

Это можно вызвать из дочерних форм как:

FormManager.ShowForm(FormManager.FormId.FormB);
1 голос
/ 16 января 2012

Попробуйте создать событие в frmChildB и подписаться на него в Parent. Затем вы можете делать то, что вы хотите, не имея ссылки на frmChildC в frmChildB.


Посмотрите на эту ссылку MSDN ;

Это очень грубо, но должно дать вам представление.

создание события в дочерних формах

public delegate void SwapEventHandler(object sender, EventArgs e);
public partial class Form2 : Form
{
    public event SwapEventHandler Swap;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Swap(sender, e);
    }
}

Заполнение в родительской форме

private void button1_Click(object sender, EventArgs e)
{
    frmChildB = new Form2();
    frmChildB.Name = "frmChildB";
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap);
    frmChildB.ShowDialog();
}


private void frmChildB_Swap(object sender, EventArgs e)
{
    frmChildB.Swap -= new SwapEventHandler(frmChildB_Swap);
    frmChildB.Close();
    frmChildB.Dispose();
    frmChildB = null;
    frmChildC = new Form2();
    frmChildC.Name = "frmChildC";
    frmChildC.Swap += new SwapEventHandler(frmChildC_Swap);
    frmChildC.ShowDialog();
}

void frmChildC_Swap(object sender, EventArgs e)
{
    frmChildC.Swap -= new SwapEventHandler(frmChildC_Swap);
    frmChildC.Close();
    frmChildC.Dispose();
    frmChildC = null;
    frmChildB = new Form2();
    frmChildB.Name = "frmChildC";
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap);
    frmChildB.ShowDialog();
}
0 голосов
/ 16 января 2012

На примитивном уровне кажется, что вы больше выиграете от использования стандартного шаблона «Мастер», чем от наличия отдельных форм для каждого вопроса.Исключением является то, что вместо обычных кнопок «Вперед» и «Назад» у вас должны быть кнопки для перехода к любому из вопросов. Вот хороший учебник , который проведет вас через обычные этапы создания мастера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...