MukulMohal Ответов: 2

Как показать форму 2 в form1 pannel2 при нажатии кнопки form1 pannel 1


Я хочу открыть форму 2 в форме 1. Я использую панель есть две панели в форме 1. Panel1 содержит кнопку и в панели 2 я хочу показать форму windows по щелчку кнопки, которая находится в panel1.


вот мой код
private void metroButton1_Click(object sender, EventArgs e)
        {
            using (CustomerReg CustReg = new CustomerReg())
            {
                pnlCustReg.Controls.Clear();
                nav(CustReg, pnlCustReg);
            }
        }


public void nav(Form form, Panel panel)
        {
            form.TopLevel = false;
            form.Size = panel.Size; // for responsive size
            panel.Controls.Clear();
            panel.Controls.Add(form);
            form.Show();
        }


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

я не могу показать форму 2 в форме 1 panel2. и я перепробовал все методы отображения данных plz help.

2 Ответов

Рейтинг:
18

Dave Kreskowiak

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

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

Но, чтобы ответить на ваш вопрос, Вы должны вызвать функцию Win32, SetParent, с WindowHandle вашей формы и WindowHandle вашего элемента управления Panel, чтобы сделать панель новым родительским элементом формы. Примеры:

Многопроцессное Приложение С Вкладками[^]
Существующий EXE-файл запускается с помощью оконной формы с использованием c#(WPF)[^]


BillWoodruff

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

OriginalGriff

+5 и от меня тоже. "Только потому, что ты *можешь* что-то сделать, ..." : смех:

Maciej Los

Должен признаться, что я был вынужден проголосовать за 5!
:)

AntGamble

Вам не нужно вызывать функции Win32 - используйте свойство 'Parent' - это даже работает в Linux через mono.

Рейтинг:
10

AntGamble

Ответ действительно прост....

public void nav(Form form, Panel panel)
        {
            form.TopLevel = false;
            form.FormBorderStyle = FormBorderStyle.None;
            form.Parent = panel;
            form.Dock = DockStyle.Fill;
            form.Show();
        }


...а чтобы удалить его, просто установите родительское значение формы в null - если вы хотите показать его самостоятельно, вам придется сбросить borderstyle/toplevel/etc. этот код предполагает, что он всегда будет находиться в контейнере.

public void navclose(Form form)
        {
            form.Parent = null;
        }