Как получить доступ к элементам управления в унаследованной форме? - PullRequest
1 голос
/ 17 ноября 2009

Я использую DockPanel Suite в своем приложении winforms. Класс DockContent является производным от класса System.Windows.Forms.Form, а две мои формы, dockRounds и dockToolbox, наследуются от класса DockContent.

Это первый раз, когда я сделал это, и это, вероятно, глупый вопрос, но во время выполнения, как я могу получить доступ к элементам управления форм dockRounds и dockToolbox?

Вот как я загружаю две формы при первом запуске приложения:

public partial class frmMainNew : Form</p> <pre><code> 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 ]

4 голосов
/ 17 ноября 2009

Есть несколько стратегий, которые вы можете использовать для достижения связи / связи между объектами в разных формах. Примечание. Мой ответ здесь не будет касаться каких-либо проблем, конкретно связанных с DockPanelSuite, и не будет рассматривать разницу между «вторичными» формами, которые являются «независимыми» (то есть они не «принадлежат» MainForm) или сделал дочерние формы MainForm. Это сознательный выбор, сделанный на основе убеждения, что то, о чем вы спрашиваете, не зависит от этих возможных вариаций в реализации.

  1. Самая простая стратегия (если она утомительна для большого количества элементов управления) - объявить Открытые свойства в ваших вторичных формах, которые предоставляют элементы управления, которыми вы хотите манипулировать из своей Основной формы. Например, предположим, что в Form2 есть кнопка, и вы хотите обработать событие click в основной форме:

В Form2 определите свойство как:

public Button form2Button
{
    get { return button1; }
}

Теперь в событии Load вашей главной формы, предполагая, что именно там создается экземпляр Form2, вы можете подписаться на событие Click кнопки в 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 = 
}

... другие стратегии ...

  1. в вашей вторичной форме, например, нажатие кнопки может инициировать публичное событие, на которое может подписаться основная форма (или любая другая сущность, которой подвергается Form2), а затем отправлять соответствующее что угодно соответствующей цели .

  2. вы можете абстрагировать передачу сообщений в целом на более высоком уровне в один (возможно, статический) класс, куда издатели отправляют сообщения, а сообщения отправляются зарегистрированным слушателям.

Наконец, обсуждение может быть интересным для вас:

Использование элементов управления одной формы в другую

лучший,

1 голос
/ 17 ноября 2009

Ваши классы, dockRounds и dockToolbox должны предоставлять любые свойства / события, к которым вы хотите получить доступ. Поэтому, если вы хотите подключиться к событию элемента управления, направьте его на публичное событие.

0 голосов
/ 17 апреля 2013

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

В Visual Studio на вкладке Свойства есть свойство Модификаторы, которое устанавливает модификатор доступа, который используется в сгенерированном файле конструктора.

Установите для этого параметра значение «Public», и вы сможете получить доступ к элементу управления из главной формы.

Я только что использовал это, когда унаследовал одну форму от другой. Установив модификатор «Защищенный» (или «Защищенный внутренний»), я смог получить доступ к элементам управления, определенным в базовом классе.

0 голосов
/ 17 ноября 2009

Вы пытались получить доступ к свойству Controls ?

var controls = dockRounds.Controls;
...