Вызов функции в классе формы из другого класса, C # .NET - PullRequest
8 голосов
/ 01 июня 2010

Может кто-нибудь сообщить мне по какому-нибудь коду, как я могу вызвать функцию, расположенную в классе Form, из другого класса?

Некоторый код будет очень полезен!

спасибо

РЕДАКТИРОВАТЬ: Это мой текущий код

 public partial class frmMain : Form
 {
    //*******Class Instances*******
    ImageProcessing IP = new ImageProcessing();


    //********************
    public void StatusUpdate(string text)
    {
        tlsStatusLabel.Text = text;
    }//


    public frmMain()
    {
        InitializeComponent();            
    }//
}


class ImageProcessing
{

    private void UpdateStatusLabel(frmMain form, string text)
    {
        form.StatusUpdate(text);
    }//

   private UpdateLabel()
   {
        UpdateStatusLabel(frmMain, "Converting to GreyScale");
   }
}

у меня проблема с frmMain.

Ответы [ 5 ]

14 голосов
/ 01 июня 2010

Быстрый и грязный способ - создать ссылку на MainForm в файле Program.cs, как указано выше.

В качестве альтернативы вы можете создать статический класс для обработки обращений к основной форме:

    public delegate void AddStatusMessageDelegate (string strMessage);

    public static class UpdateStatusBarMessage
        {

        public static Form mainwin;

        public static event AddStatusMessageDelegate OnNewStatusMessage;

        public static void ShowStatusMessage (string strMessage)
            {
            ThreadSafeStatusMessage (strMessage);
            }

        private static void ThreadSafeStatusMessage (string strMessage)
            {
            if (mainwin != null && mainwin.InvokeRequired)  // we are in a different thread to the main window
                mainwin.Invoke (new AddStatusMessageDelegate (ThreadSafeStatusMessage), new object [] { strMessage });  // call self from main thread
            else
                OnNewStatusMessage (strMessage);
            }

        }

Поместите вышесказанное в файл MainForm.cs внутри пространства имен, но отдельно от вашего класса MainForm.
Затем поместите этот вызов в ваш основной класс MainForm.cs.

     void UpdateStatusBarMessage_OnNewStatusMessage (string strMessage)
     {
          m_txtMessage.Caption = strMessage;
     }

Затем, когда вы инициализируете MainForm.cs, добавьте этот дескриптор события в вашу форму.

     UpdateStatusBarMessage.OnNewStatusMessage += UpdateStatusBarMessage_OnNewStatusMessage;

В любом UserControl или форме, связанной с формой (MDI), которую вы хотите вызвать, просто сообщите нам следующее ...

     UpdateStatusBarMessage.ShowStatusMessage ("Hello World!");

Поскольку он статический, его можно вызывать из любой точки вашей программы.

3 голосов
/ 01 июня 2010

Это довольно просто. Либо передайте ссылку на существующую форму в вызове, либо создайте новый экземпляр вашей формы, а затем вызовите свой метод, как и любой другой:

public class MyForm : Form
{
    public void DoSomething()
    {
        // Implementation
    }
}

public class OtherClass
{
    public void DoSomethingElse(MyForm form)
    {
        form.DoSomething();
    }
}

Или сделайте его статическим методом, чтобы вам не приходилось создавать экземпляр (но он не сможет изменять открытые окна формы).

UPDATE

Похоже, класс ImageProcessing никогда не получает ссылку на форму. Я бы немного изменил твой код:

class ImageProcessing
{
    private frmMain _form = null;    

    public ImageProcessing(frmMain form)
    {
        _form = form;
    }

    private UpdateStatusLabel(string text)
    {
        _form.StatusUpdate(text);
    }
}

А затем один маленький твик в конструкторе Form:

ImageProcessing IP = new ImageProcessing(this);
1 голос
/ 29 декабря 2014

Вы можете сделать это простым способом:

1 - создайте открытый класс и определите открытую статическую переменную следующим образом:

class Globals
{
   public static Form1 form;
}

2- в функции загрузки в форме напишите эту строку:

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        Globals.form= this;
    }

    public void DoSomthing()
    {
        ............
    }
}

3 - наконец, в вашем пользовательском классе вы можете вызывать все открытые функции внутри формы:

public class MyClass
{
    public void Func1()
    {
        Globals.form.DoSomthing();
    }
}

Надеюсь, этот код будет вам полезен:)

1 голос
/ 01 июня 2010

Если метод не связан с пользовательским интерфейсом, из вашего примера я понимаю, что это не так, вы можете создать другой класс, который будет содержать этот метод, а затем использовать его в своем классе Form и в других местах, где вы используйте это.

1 голос
/ 01 июня 2010

Вам нужно будет создать новый экземпляр Form и затем вызвать его, используя экземпляр. Если он статический, то вы можете просто вызвать его, вызвав Form1.Method ().

Form1 form1 = new Form1();
form1.Method();

Я бы посоветовал вам переместить этот общий метод в другой класс.

Если это обычный метод для использования в пользовательском интерфейсе, создайте базовый класс Form и извлеките все ваши формы с помощью этого базового класса формы. Теперь переместите этот общий метод в базовую форму. Затем вы можете использовать метод из любой формы, полученной из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...