Как получить доступ к элементам управления в унаследованной форме?
Я использую DockPanel Suite в своем приложении winforms. Класс DockContent является производным от класса System.Windows.Forms.Form, а две мои формы, dockRounds и dockToolbox, наследуются от класса DockContent.
Это первый раз, когда я сделал это, и это, вероятно, глупый вопрос, но во время выполнения, как я могу получить доступ к элементам управления форм dockRounds и dockToolbox?
Вот как я загружаю две формы при первом запуске приложения:
public partial class frmMainNew : Form
clsMWDockPanel mapPanel; dockToolbox dockT = new dockToolbox(); dockRounds dockR = new dockRounds(); public frmMainNew() { InitializeComponent(); dockPanel = new DockPanel(); SuspendLayout(); dockPanel.Parent = panelMain; dockPanel.Dock = DockStyle.Fill; dockPanel.DefaultFloatWindowSize = new Size(108, 528); dockPanel.BringToFront(); dockPanel.BackColor = Color.Transparent; dockPanel.DocumentStyle = DocumentStyle.DockingSdi; ResumeLayout(); string error = "Errors:\r\n"; try { loadRounds(); loadToolbox(); } catch (Exception) { error = error + "The Toolbox and/or Rounds menu could not be created\r\n"; } } public void loadToolbox() { dockT.CloseButton = false; dockT.ShowHint = DockState.Float; dockT.Text = "Toolbox"; dockT.BackColor = Color.WhiteSmoke; dockT.Icon = this.Icon; dockT.Show(dockPanel); } public void loadRounds() { if (mapPanel == null) { CreateMapPanel().Show(dockPanel, DockState.Document); } mapMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; //mapMain.BringToFront(); dockR.CloseButton = false; dockR.ShowHint = DockState.DockRightAutoHide; dockR.Text = "Rounds Menu"; dockR.BackColor = Color.WhiteSmoke; dockR.Icon = this.Icon; dockR.Show(dockPanel); } DockContent CreateMapPanel() { mapPanel = new clsMWDockPanel(); mapPanel.ShowHint = DockState.Document; mapPanel.Controls.Add(mapMain); return mapPanel; }
Спасибо заранее
Leddy
4 ответа
Есть несколько стратегий, которые вы можете использовать для достижения связи / связи между объектами в разных формах. Примечание. Мой ответ здесь не будет касаться каких-либо проблем, конкретно связанных с DockPanelSuite, и не будет учитывать разницу между "вторичными" формами, которые являются "независимыми" (т. Е. Они не "принадлежат" MainForm) или сделал дочерние формы MainForm. Это сознательный выбор, сделанный на основе убеждения, что то, о чем вы спрашиваете, не зависит от этих возможных изменений в реализации.
- Самая простая стратегия (если она утомительна для большого количества элементов управления) - объявить Открытые свойства в ваших вторичных формах, которые предоставляют элементы управления, которыми вы хотите манипулировать, из своей Основной формы. Например, предположим, что в Form2 есть кнопка, и вы хотите обработать событие click в основной форме:
В Form2 определите свойство как:
public Button form2Button
{
get { return button1; }
}
Теперь в событии Load вашей главной формы, предполагая, что именно там создается экземпляр Form2, вы можете подписаться на событие Click кнопки Button в Form2:
Form2 myForm2;
Form3 myForm3;
private void Form1_Load(object sender, EventArgs e)
{
myForm2 = new Form2();
myForm2.form2Button.Click += new EventHandler(form2Button_Click);
myForm3 = new Form3();
}
И вы можете легко представить, что в Form3 у вас есть TextBox, который вы открыли с помощью Public Property так же, как вы открыли Button в Form2.
Таким образом, вы можете реализовать обработчик событий MainForm, например, для нажатия кнопки на Form2:
public void form2Button_Click(object sender, EventArgs e)
{
// do something here with the TextBox on Form3
// myForm3.theTextBox.Text =
}
... другие стратегии...
например, в вашей вторичной форме нажатие кнопки может вызвать публичное событие, на которое может подписаться основная форма (или любая другая сущность, которой подвергается Form2), и затем отправить соответствующее что-либо для соответствующей цели.
Вы можете абстрагировать передачу сообщений в целом на более высоком уровне в единый (возможно, статический) класс, куда издатели отправляют сообщения, а сообщения отправляются зарегистрированным слушателям.
Наконец, обсуждение здесь может быть интересным для вас:
Использование элементов управления одной формы в другую
Лучший,
Ваши классы, dockRounds и dockToolbox должны предоставлять любые свойства / события, к которым вы хотите получить доступ. Поэтому, если вы хотите подключиться к событию элемента управления, направьте его на публичное событие.
Вы можете установить модификатор доступа на элементе управления, чтобы сделать его доступным по своему усмотрению. По умолчанию установлено значение "Private", поэтому вы не можете получить доступ к элементам управления из главной формы.
В Visual Studio на вкладке Свойства есть свойство Модификаторы, которое устанавливает модификатор доступа, который используется в сгенерированном файле конструктора.
Установите для этого параметра "Public", и вы сможете получить доступ к элементу управления из основной формы.
Я просто использовал это, когда унаследовал одну форму от другой. Установив модификатор "Защищенный" (или "Защищенный внутренний"), я смог получить доступ к элементам управления, определенным в базовом классе.
Вы пытались получить доступ к свойству Controls?
var controls = dockRounds.Controls;