Как вызвать метод дочерней формы из mdi parent c#

У меня есть несколько дочерних форм, но в них есть один общий метод, get_CurrentClamp(). я хочу вызвать метод текущего активного mdichild из родителя MDI.

Это событие onclick элемента меню в форме MDIparent MDIMain.cs, которое должно вызвать метод.

....
 private void mnugetCToolStripMenuItem_Click(object sender, EventArgs e)
   {
    if (MdiChildren.Any())
            {
                Form f = this.ActiveMdiChild;            
               f.get_CurrentClamp(varCurrentThreshhold);
            }
   }
.....

В дочерней форме frmDashboard.cs

public void get_CurrentClamp(float curThreshhold=5.5)
        {
           ...
        }

Но я продолжаю получать сообщение об ошибке, где я ошибаюсь? Любая помощь будет оценена!

ошибка получения это

Ошибка 3 «System.Windows.Forms.Form» не содержит определения для «get_CurrentClamp», и не удалось найти метод расширения «get_CurrentClamp», принимающий первый аргумент типа «System.Windows.Forms.Form» (вы пропустили используя директиву или ссылку на сборку?)

Это ошибка, которую я получаю в форме mdiparent.


person indago    schedule 04.12.2014    source источник
comment
вы получаете, что get_CurrentClamp не найден?   -  person    schedule 04.12.2014
comment
Вы выполняете приведение к стандартному типу Form, который, конечно же, не имеет метода get_CurrentClamp(). Вы можете использовать Reflection, чтобы получить метод и вызвать его. Лучшим решением было бы реализовать во всех ваших дочерних формах Interface, включающий этот метод; затем вы можете перейти к интерфейсу и вызвать метод...   -  person Idle_Mind    schedule 04.12.2014
comment
@MarkHall, я добавил сообщение об ошибке к вопросу   -  person indago    schedule 04.12.2014
comment
Ваше сообщение об ошибке подтверждает то, что все уже знали. Смотрите мой комментарий. Вы собираетесь решать с помощью Reflection или Interface? Отредактируйте детали, если вы застряли на реализации...   -  person Idle_Mind    schedule 04.12.2014


Ответы (2)


Если вы уверены, что активная форма будет одним из экземпляров frmDashboard, вы можете объявить f как относящийся к этому типу:

frmDashboard f = this.ActiveMdiChild;

Возможно, вы захотите попробовать/поймать это на всякий случай. (Во всяком случае, работает в VB. Насчет C# не уверен.)

person xpda    schedule 04.12.2014

Благодаря Idle_Mind я решил проблему с помощью интерфейса. я создал новый интерфейс в файле с именем IChildMethods.cs, и ниже приведен интерфейс

 internal interface IChildMethods
    {
        void get_CurrentClamp(float curThreshhold=5.5);
    }

и в дочерние формы я просто включил интерфейс, как показано ниже, в форму frmDashboard.cs;

 public partial class frmDashboard : Form, IChildMethods

и на mdiform MDIMain.cs

....
 private void mnugetCToolStripMenuItem_Click(object sender, EventArgs e)
   {
    if (MdiChildren.Any())
            {
               if (this.ActiveMdiChild is IChildMethods)
            {
                ((IChildMethods)this.ActiveMdiChild).get_CurrentClamp(varCurrentThreshhold);
            }            

            }
   }
.....

Я не пробовал использовать метод отражения, так как метод интерфейса работал, но мне просто интересно, лучше ли отражение, чем использование интерфейса в такой проблеме.

person indago    schedule 05.12.2014