2015-12-04 3 views
0

Я новичок в формах окон C#, и я пытаюсь создать графический интерфейс с двумя панелями. Левая панель используется для отображения динамически добавленных пользовательских элементов управления, содержащих кнопки. Правая панель используется для отображения динамически добавленных пользовательских элементов управления, которые содержат другие элементы управления: текстовые поля, метки, выпадающие списки, кнопки и т. Д.Добавить/удалить панель управления, нажав кнопку на динамически добавленном usercontrol

Я создал форму 1 с двумя панелями. Я могу успешно загрузить обе панели с другим контентом UserControl.cs, используя меню, которое я добавил в начало формы. Когда я нажимаю параметр меню, form1 buttonPanel загружается соответствующим содержимым buttonPanel.cs и form1 mainPanel загружается соответствующим содержимым mainPanel.cs. Однако, когда я нажимаю кнопку, которая существует на buttonPanel.cs, я не могу получить form1 mainPanel, чтобы изменить ее содержимое.

ie: WelcomeMenu.cs имеет кнопку btnPage2, которая должна менять элементы управления mainPanel, чтобы показать пользовательское управление Page2.cs вместо функции Welcome.cs usercontrol.

Я хочу, чтобы иметь возможность использовать в кнопке обработчик щелчка на UserControl.cs:

mainPanel.Controls.Clear(); 
UserControl usrCtl = new UserControl(); 
Form1.mainPanel.Controls.Add(usrCtl); 

Моя проблема, кажется, что WelcomeMenu.cs не может видеть или получить доступ Form1 mainPanel.

Есть ли способ сделать эту работу? Или я пытаюсь сделать это неправильно?

Моя причина для этого метода заключается в том, что я могу загрузить новую команду buttonPanel.cs usercontrol и mainPanel.cs usercontrol для каждого отдела, а затем иметь возможность изменять содержимое mainPanel для каждой кнопки, которую я нажимаю в текущей кнопкеPanel. Я пытаюсь избежать создания группы панелей на Form1, а затем скрывать их и делать их видимыми только тогда, когда они мне нужны.

Обновление: buttonMenu.cs

{

{ 
public partial class ucWelcomeMenu : UserControl 

    public ucWelcomeMenu() 
    { 
     InitializeComponent(); 
    } 

    private void btnPage2_Click(object sender, EventArgs e) 
    { 
     Form1.mainPanel.Controls.Clear(); 
     ucWelcome frm = new ucWelcome(); 
     Form1.mainPanel.Controls.Add(frm); 
    } 
} 

}

Form1.mainPanel.Controls.Add (FRM) генерирует ошибку на Form1.mainPanel, что гласит: «An ссылка объекта требуется для нестатического поля, метода или свойства 'Form1.mainPanel'

ОБНОВЛЕНИЕ 2:

Ok. Я искал несколько разных ссылок и нашел полезную информацию. Тем не менее, я все еще не могу запустить событие из нажатия кнопки в динамически добавленном UserControl.cs. У меня 2 панели на Form1. menuPanel и mainPanel. Оба они установлены в Modifiers = Public.

Вот мой Form1:

namespace TestUserControl 

public partial class Form1 : Form 
{ 
    private ucWelcomeMenu welc = new ucWelcomeMenu(); 

    public Form1() 
    { 
     InitializeComponent(); 

     ucWelcomeMenu welcomeMenu = new ucWelcomeMenu(); 
     menuPanel.Controls.Add(welcomeMenu); 

     welc.ButtonClick += new EventHandler(this.CustomEvent_Handler); 
    } 

    private void CustomEvent_Handler(object sender, EventArgs e) 
    { 
     MessageBox.Show("Yes"); 
    } 
} 

}

И вот мой UserControl:

namespace TestUserControl.UserControls 

public partial class ucWelcomeMenu : UserControl 
{ 
    public event EventHandler ButtonClick; 

    public ucWelcomeMenu() 
    { 
     InitializeComponent(); 
    } 

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

}

+0

Пользователь UserControl имеет свойство, называемое 'ParentForm'. Попробуйте использовать это вместо «Form1», что является неприемлемой ссылкой. Передайте его Form1. Не самая лучшая установка. Ваш UserControl действительно должен просто поднять событие и позволить форме заботиться об этом бизнесе. Кроме того, элементы управления очисткой не утилизируют их. Вы должны избавиться от них, когда закончите. – LarsTech

+0

@LarsTech - это правильно. Я пропустил эту часть. Тем не менее, mainPanel все еще требует установки в Public для его модификатора для других UserControls, чтобы иметь возможность ссылаться на него. –

+0

Это похоже на то, что мне нужно. Не знаете, как рассказать о моем вопросе поиска. Можете ли вы рассказать мне, что я должен искать, чтобы найти несколько примеров того, как позволить событию обрабатывать этот тип проблемы? –

ответ

0

Установите доступность Модификаторы свойство mainPanel из частных до внутренних общественность.

+0

Прошу прощения за мою плотность. Я не могу найти какое-либо свойство, называемое доступностью, которое не связано с приложениями доступности. Я нашел свойство под названием Design под названием Modifiers, которое в настоящее время указано как Private. Я изменил это на Internal, и он все еще не работает. –

+0

Хорошо. Я изменил Модификаторы на Public, и я получу ошибку, указанную выше, когда я пытаюсь добавить элемент управления. –

1

Ok. Я определенно немного медленный. Я нашел свою проблему. Я дважды запускал ucWelcomeMenu. После того как я удалил частную инстанцию ​​над конструктором, событие было выпущено просто отлично. Спасибо за все входные данные. Он отправил меня на хорошие ссылки с очень полезной информацией.

Вот что я закончил с:

Form1 меню Option Нажмите Handler:

 private void option1ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     UserControl1 ctl1 = new UserControl1(); 
     menuPanel.Controls.Add(ctl1); 

     ctl1.btn1Click += new EventHandler(btn1_Click); 

     UserControl2 ctl2 = new UserControl2(); 
     mainPanel.Controls.Add(ctl2); 
    } 

Кнопка 1 Нажмите Handler на Form1:

 private void btn1_Click(object sender, EventArgs e) 
    { 
     mainPanel.Controls.Clear(); 
     UserControl2 frm = new UserControl2(); 
     mainPanel.Controls.Add(frm); 
    } 

UserControl1.cs

public partial class UserControl1 : UserControl 
{ 
    public event EventHandler btn1Click; 

    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    private void btn1_Click(object sender, EventArgs e) 
    { 
     if (btn1Click!= null) 
      btn1Click(sender, e); 
    } 
} 
Смежные вопросы