Как динамически загрузить панель в Windows Forms? - PullRequest
3 голосов
/ 28 февраля 2010

в верхней части winform есть несколько кнопок, и когда я нажимаю на одну из них, панель ниже загружает другую предопределенную панель, как я могу реализовать это?

см. Этот пример:

enter image description here

Ответы [ 4 ]

3 голосов
/ 28 февраля 2010

Вот решение, использующее стандартный WinForms TabControl, в котором вкладки скрыты во время выполнения, но, конечно, они доступны во время разработки.

Допущения:

  1. Вы не хотите заниматься созданием вкладок OwnerDrawn, что возможно.

  2. Стандартный WinForms TabControl удовлетворит все ваши потребности во время разработки.

Код:

  1. В событии Form Load формы, в которой размещается ваш TabControl, используйте код, подобный следующему:

    tabControl1.Region = new Region(tabControl1.DisplayRectangle);
    

    Чтобы скрыть вкладки.

  2. Затем «свяжите» ваши кнопки, чтобы справиться с выбором различных TabPages в TabControl. Очевидно, вы могли бы сделать это более элегантно, чем это:

    private void button1_Click(object sender, EventArgs e)
    {
      tabControl1.SelectedTab = tabControl1.TabPages[0];
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
      tabControl1.SelectedTab = tabControl1.TabPages[1];
    }
    

Примечание: если вы хотите вставить вторичные Forms или UserControls в TabPages TabControl: это не проблема: конечно, проще использовать UserControls. Вставьте их в коллекцию Controls каждой вкладки и установите для их свойства Dock значение DockStyle.Fill.

Примечание: есть более изящные способы скрытия вкладок, например использование производного TabControl, как показано здесь в CodeProject: TabControl в WinForm без отображения заголовка Tab? Существуют и другие решения, которые используют модифицированный WndProc. Их не сложно найти.

2 голосов
/ 28 февраля 2010

То, что вы можете сделать, это иметь их каждый в отдельном Panel. Установите для свойства Visible значение false для каждого. Когда событие Click на кнопке, установите для свойства Visible всех из них значение false и установите для параметра Visible, для которого вы хотите, значение true.

2 голосов
/ 28 февраля 2010

Я не знаю точно, что вы пытаетесь сделать, но если в вашей форме есть Panel с именем contentArea и создана группа пользовательских элементов управления (но не в форме), то вы могли бы используйте это как обработчик события для кнопки:

public void myButton_Click(object sender, EventArgs e) {
    contentArea.Controls.RemoveAt(0);
    contentArea.Controls.Add(new MyUserControl());
}

... хотя, как говорили другие люди, в этом случае лучше использовать вкладку.

1 голос
/ 04 марта 2012

Например, если у вас есть две формы Form1 и Form2, и вы хотите загрузить form2 внутри from1. когда вы нажимаете кнопку для загрузки form2, код выглядит так

private void button1_Click(object sender, EventArgs e)
{
     Form2 form2 = new Form2();
     this.Controls.Clear();
     foreach(Control c in this.Controls)
     {
         this.Controls.Add(c);
     }
}

этот код загрузит все элементы управления в form2 в form1.

...